`
lizhuang
  • 浏览: 903890 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

截取部分图片

阅读更多
在ios开发中,肯定会碰到需要截取部分图片的情况。

最终的效果类似这样:



先看最原始的示例,显示完整的图片

写了个最简单的读取图片并显示的代码,打算以此为开始,逐渐实现截取部分图片的功能。

代码主要是,在控制器代码中:

- (void)loadView {
    [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation: UIStatusBarAnimationSlide];
    UIImage *image=[UIImage imageNamed:@"1.jpg"];
   
    UIImageView *contentView = [[UIImageView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
    [contentView setImage:image];
   
    self.view=[[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
    [self.view addSubview:contentView];
}

另外,应该有一个名为1.jpg的768×1024的图片(我这里是iPad)。




截取整个图片

可以认为截取整个图片是截取部分图片的一个特例。对ios不熟嘛,因此打算很谨慎的推进。截取整个图片可以减少中间的复杂性。

根据API,摸索着写了一个示例,效果出乎意料:



代码:

- (void)loadView {
    [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation: UIStatusBarAnimationSlide];
    UIImage *image=[UIImage imageNamed:@"1.jpg"];
   
    UIImageView *contentView = [[UIImageView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
    //[contentView setImage:image];
   
    CGRect rect = CGRectMake(0, 0, 768, 1024);//创建矩形框
    UIGraphicsBeginImageContext(rect.size);//根据size大小创建一个基于位图的图形上下文
    CGContextRef currentContext = UIGraphicsGetCurrentContext();//获取当前quartz 2d绘图环境
    CGContextClipToRect( currentContext, rect);//设置当前绘图环境到矩形框
   
    CGContextDrawImage(currentContext, rect, image.CGImage);//绘图
    UIImage *cropped = UIGraphicsGetImageFromCurrentImageContext();//获得图片
    UIGraphicsEndImageContext();//从当前堆栈中删除quartz 2d绘图环境
   
    contentView.image=cropped;
   
    self.view=[[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
    [self.view addSubview:contentView];

    [cropped release];
}

这个代码说明了两点:

好的方面:说明我的代码起作用了,确实截取了所需的图形
坏的方面:图形是颠倒的,而且是镜像的。
问题应该出在坐标系上。下面画了一个quartz 2d的坐标系,坐标原点在左下角:



因此以这个坐标系取图形,就会有转向180°的效果。

其实如果是对图片的缩放,而不是剪切部分图片内容,这样写就可以了:

- (void)loadView {
    [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation: UIStatusBarAnimationSlide];
    UIImage *image=[UIImage imageNamed:@"1.jpg"];
   
    //[contentView setImage:image];
   
    CGRect rect = CGRectMake(0, 0, 384, 512);//创建矩形框
    UIGraphicsBeginImageContext(rect.size);//根据size大小创建一个基于位图的图形上下文
    CGContextRef currentContext = UIGraphicsGetCurrentContext();//获取当前quartz 2d绘图环境
    CGContextClipToRect(currentContext, rect);//设置当前绘图环境到矩形框
   
    //CGContextRotateCTM(currentContext, 50);
   
    //CGContextDrawImage(currentContext, rect, image.CGImage);//绘图
   
    [image drawInRect:rect];
   
    UIImage *cropped = UIGraphicsGetImageFromCurrentImageContext();//获得图片
    UIGraphicsEndImageContext();//从当前堆栈中删除quartz 2d绘图环境
   
    UIImageView *contentView = [[UIImageView alloc] initWithFrame:rect];
    contentView.image=cropped;
   
    self.view=[[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
    [self.view addSubview:contentView];

    [cropped release];
}

效果类似这样:



这个方法可以帮助我们在后续开发中实现缩略图。但是不符合现在的需求。

于是想了下面的基本思路:



这样,需要一个能旋转和向下移动的API。ios提供了C++界面的函数调用:

CGContextRotateCTM,实现角度的转换
CGContextTranslateCTM,可以重新设置坐标系原点,平移坐标系和移动图片是等效的
代码:

- (void)loadView {
    [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation: UIStatusBarAnimationSlide];
    UIImage *image=[UIImage imageNamed:@"1.jpg"];
   
    //[contentView setImage:image];
   
    CGRect rect = CGRectMake(0, 0, 384, 512);//创建矩形框
    UIGraphicsBeginImageContext(rect.size);//根据size大小创建一个基于位图的图形上下文
    CGContextRef currentContext = UIGraphicsGetCurrentContext();//获取当前quartz 2d绘图环境
    CGContextClipToRect(currentContext, rect);//设置当前绘图环境到矩形框
   
    CGContextRotateCTM(currentContext, M_PI);
    CGContextTranslateCTM(currentContext, -rect.size.width, -rect.size.height);
   
    CGContextDrawImage(currentContext, rect, image.CGImage);//绘图
   
    //[image drawInRect:rect];
   
    UIImage *cropped = UIGraphicsGetImageFromCurrentImageContext();//获得图片
    UIGraphicsEndImageContext();//从当前堆栈中删除quartz 2d绘图环境
   
    UIImageView *contentView = [[UIImageView alloc] initWithFrame:rect];
    contentView.image=cropped;
   
    self.view=[[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
    [self.view addSubview:contentView];

    [cropped release];
}



这个结果还有缺陷,可以看到图片是正立的了,但是图片反转了,是个镜像。

解决办法也有,不过不是操作图片了,而是操作图片所在的视图。思路是把视图看作一个位图的矩阵,对它做矩阵变换运算,使视图做镜像反转。写法很简单:

- (void)loadView {
    [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation: UIStatusBarAnimationSlide];
    UIImage *image=[UIImage imageNamed:@"1.jpg"];
   
    //[contentView setImage:image];
   
    CGRect rect = CGRectMake(0, 0, 384, 512);//创建矩形框
    UIGraphicsBeginImageContext(rect.size);//根据size大小创建一个基于位图的图形上下文
    CGContextRef currentContext = UIGraphicsGetCurrentContext();//获取当前quartz 2d绘图环境
    CGContextClipToRect(currentContext, rect);//设置当前绘图环境到矩形框
   
   
    CGContextRotateCTM(currentContext, M_PI);
    CGContextTranslateCTM(currentContext, -rect.size.width, -rect.size.height);
    //CGContextTranslateCTM(currentContext,0.0,200.0);
   
    CGContextDrawImage(currentContext, rect, image.CGImage);//绘图
   
    //[image drawInRect:rect];
   
    UIImage *cropped = UIGraphicsGetImageFromCurrentImageContext();//获得图片
    UIGraphicsEndImageContext();//从当前堆栈中删除quartz 2d绘图环境
   
       
    UIImageView *contentView = [[UIImageView alloc] initWithFrame:rect];
    contentView.image=cropped;
   
    contentView.transform = CGAffineTransformIdentity;
    contentView.transform = CGAffineTransformMakeScale(-1.0, 1.0);

   
    self.view=[[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
    [self.view addSubview:contentView];

    [cropped release];
}



这里的转换因子,一个是针对x轴的,一个是针对y轴的。终于可以产生这样的效果了:



这里参考了这个文档:

http://macdevcenter.com/pub/a/mac/2004/11/02/quartz.html

虽然是很古老的文章了,但是说的很清楚。另外,方法名称已经发生变化,需要注意。

截取部分图片

截取部分图片,比如:



截取左边人像部分。

实现后的代码,效果是这样的:



如何实现的呢,这时候才发现,其实根本不需要上面那些转换,如果不使用quartz 2d的话,截取部分图片这么简单:

- (void)loadView {
    [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation: UIStatusBarAnimationSlide];
    UIImage *image=[UIImage imageNamed:@"1.jpg"];
   
   
    CGRect rect = CGRectMake(60, 80, 331, 353);//创建矩形框
    UIImageView *contentView = [[UIImageView alloc] initWithFrame:rect];
    contentView.image=[UIImage imageWithCGImage:CGImageCreateWithImageInRect([image CGImage], rect)];
   
    self.view=[[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
    [self.view addSubview:contentView];
   
    [image release];
}

虽然编写代码的过程是曲折的,但是摸到很多有用的东西,都是以后要用到的。
分享到:
评论

相关推荐

    BMP.zip_从BMP图像中截取部分图片

    在本主题中,我们将深入探讨如何从BMP图像中截取部分图片。BMP(Bitmap)是一种常见的位图文件格式,通常用于存储无压缩的像素数据。在许多情况下,我们可能需要从一个大BMP图像中提取特定区域,例如为了创建缩略图...

    android框选图片中的一部分并截取

    在Android平台上,框选图片中的一部分并截取是一项常见的需求,比如在应用中实现自定义截图功能、编辑图片或者在图像处理中选择特定区域。这个功能涉及到多个Android SDK中的类和方法,包括图像处理、视图操作以及...

    c#截取一张图片的部分 或者缩放图片

    // 创建新的Bitmap对象用于存储截取部分 Bitmap croppedImage = new Bitmap(rect.Width, rect.Height); // 使用Graphics对象从原图截取指定区域 using (Graphics g = Graphics.FromImage(croppedImage)) { g....

    图片截取和图片服务器

    这个过程涉及到图像处理技术,包括裁剪、调整大小等,确保用户截取的部分被准确无误地保留下来。 接下来,是“图片上传”的环节。在图片剪切完成后,一般会将其压缩以减少传输时间和存储空间。可以使用JPEGmini、...

    js 截取图片代码(截取中间部分)

    js 截取图片代码

    JS 按图片比例截取中间部分 缩略图不失真

    在JavaScript(JS)中,创建一个按比例截取图片中间部分并保持图片不失真的缩略图功能是一项常见的需求。这通常应用于图片预览、相册展示等场景,以提高用户体验和节省网页加载资源。以下是对这个主题的详细阐述: ...

    jquery图片截取DEMO

    这些坐标信息可以用来标识用户想要截取的图片部分。 4. **坐标系统转换**:在浏览器环境中,图片坐标系统与HTML元素坐标系统不同。图片截取需要将用户在图片上的选择转换为相对于图片左上角的像素坐标,以便后续...

    DELPHI进行图片截图,并生成新的图片

    2. **截取部分图片**: 如果需要截取屏幕的特定部分,可以在用户选择矩形区域后,调整BitBlt的源矩形参数。例如,用户通过鼠标拖动定义了一个矩形,那么就可以根据这个矩形的坐标来调整BitBlt的srcRect参数,只截取...

    java用ffmpeg截取视频图片

    Java 使用 FFmpeg 截取视频图片是一个常见的任务,它涉及到多媒体处理、命令行操作和跨平台编程。FFmpeg 是一个强大的开源工具集,用于处理音频和视频文件,包括编码、解码、转码、流处理等功能。在 Java 中,我们...

    java 拍照 截取图片

    在Java编程环境中,实现“拍照”和“截取图片”的功能涉及到多个技术层面,包括Web应用、设备访问、图像处理等。以下将详细介绍这些知识点: 1. **Java Web 应用**: Java Web应用程序是基于Java技术构建的,可以...

    基于jquery的图片截取工具

    在用户完成截取后,可以调用`canvas.toDataURL()`方法将截取的部分转换为base64编码的图片URL。 5. **交互界面**:为了提高用户体验,可以添加控制按钮,如“预览”、“确定”、“重置”等,使用jQuery处理按钮点击...

    iOS uiimage部分截取图片

    在特定场景下,我们可能需要从一个UIImage对象中部分截取图片,例如创建可拉伸的按钮背景或者实现自定义的图片效果。"stretchableImageWithLeftCapWidth"和"resizableImageWithCapInsets"这两个方法是UIImage的重要...

    ios-截取图片指定部分.zip

    在iOS开发中,有时我们需要根据需求截取图片的指定部分,比如在制作拼图应用、截图分享或编辑功能时。这个“ios-截取图片指定部分.zip”文件可能包含了一个示例项目,用于演示如何在iOS应用中实现这一功能。下面我们...

    delphi 10.2 图片截取生成头像图片

    关于图片截取部分,开发者可能使用了 Delphi 的 TImage 控件来显示原始图片,然后利用 TCanvas 对象来实现截取操作。TCanvas 提供了画笔、刷子等图形绘制工具,可以用来绘制矩形选择框,实现拖拽截取。放大缩小功能...

    jquery 图片上传并截取

    本文将深入探讨如何使用jQuery实现图片上传...接下来是图片截取的部分。这里涉及到一个名为jsCropImage的库,它提供了图片裁剪的功能。在项目中,我们首先要引入这个库,可以通过CDN或者下载到本地后引用: ```html ...

    javascript 截取图片

    6. **获取截取数据**:使用`getImageData()`获取截取部分的像素数据,`toDataURL()`生成截取后的图片base64编码,可以将其插入到`<img>`元素或者发送到服务器。 此外,还可以结合CSS3的`clip-path`属性,创建一个可...

    从原图片中截取部分生成新的图片

    C#从图片中截取部分生成新图,参数:原始图片路径、生成新图路径、截取图片宽度、截取图片高度、截图原图片X坐标、截取原图片Y坐标

    自动截取屏幕图片源码

    在IT领域,自动截取屏幕图片的技术是一种常用的数据获取和监控手段,尤其在远程协助、教育监控、软件测试以及安全审计等场景下有着广泛的应用。本项目提供的源码旨在实现这一功能,允许用户监控电脑使用情况,并将...

    C#截取网页生成图片

    - **性能优化**: 对于大型或复杂的网页,可能需要优化渲染速度,例如只截取可见部分或分块加载。 总之,"C#截取网页生成图片"是一个实用的技术点,结合了C#的桌面应用开发能力与网页渲染技术。通过理解并运用上述...

    JS实现截取图片

    JS实现:鼠标操作的,方框截取图片部分内容,只有截图部分,入股有其他功能,可以再叠加

Global site tag (gtag.js) - Google Analytics