`
zani
  • 浏览: 354497 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

[转载]截取部分图片并显示

 
阅读更多

[转自]http://marshal.easymorse.com/archives/3703

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

最终的效果类似这样:

imageimage

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

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

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

- (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,摸索着写了一个示例,效果出乎意料:

image

代码:

- (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的坐标系,坐标原点在左下角:

image

因此以这个坐标系取图形,就会有转向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]; 
}

效果类似这样:

image

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

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

image

这样,需要一个能旋转和向下移动的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]; 
}

image

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

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

- (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轴的。终于可以产生这样的效果了:

image

这里参考了这个文档:

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

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

截取部分图片

截取部分图片,比如:

image

截取左边人像部分。

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

image

如何实现的呢,这时候才发现,其实根本不需要上面那些转换,如果不使用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]; 
}

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

分享到:
评论

相关推荐

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

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

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

    通过以上步骤,我们可以实现Android应用程序中框选图片并截取的功能。这个过程涉及到图像处理、用户交互和图形绘制等多个方面,对Android开发者来说是一个很好的实践和学习机会。在实际开发中,还需要考虑性能优化、...

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

    3. **CSS解决方案**:利用CSS的`object-fit`属性,可以轻松实现按比例缩放图片并裁剪多余部分。设置`object-fit: cover;`可以让图片填充整个容器,同时保持其纵横比,这样可以确保图片不失真。然后通过CSS的定位(`...

    .net上传图片并在线截取图片

    在.NET开发环境中,实现“上传图片并在线截取图片”的功能是一项常见的需求,尤其是在构建Web应用时,如社交网络、论坛或个人空间等。这个功能可以让用户上传自己的图片,并在服务器端或客户端调整图片的大小,类似...

    mfc 显示图片,鼠标截取一部分会显示在另一个控件上

    在MFC(Microsoft Foundation Class)库中,显示图片并...以上就是如何在MFC应用中实现显示图片、鼠标截取以及将截取部分显示在另一个控件上的详细步骤。通过理解并实践这些代码,你可以为你的MFC项目增加类似的功能。

    图片截取和图片服务器

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

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

    js 截取图片代码

    java 拍照 截取图片

    无论是截取的图片还是拍照得到的图片,都需要进行处理,例如保存、上传、显示等。Java中的`java.awt.image`和`javax.imageio`包提供了基本的图像读写和处理功能。例如,`BufferedImage`类用于在内存中表示图像,`...

    html2canvas使用JavaScript将整个网页或一部分区域截取成图片并导出

    可以尝试分块截取,或者只截取需要的部分。 总结,html2canvas是一个非常有用的工具,它使得在浏览器端动态生成网页截图成为可能。通过了解其原理和使用技巧,我们可以解决各种场景下的需求,如网页保存、分享和...

    jquery图片截取DEMO

    在IT行业中,jQuery图片截取是一项常见的前端技术,主要用于用户交互式地选择并截取图片的特定区域。这个"jquery图片截取DEMO"提供了一个实际应用的例子,帮助开发者理解和实现这一功能。以下是对这个DEMO相关的知识...

    jquery 图片上传并截取

    5. 在服务器端根据裁剪信息截取图片并返回处理后的结果。 以上就是关于“jQuery图片上传并截取”这一主题的详细解释,希望对你有所帮助。在实际开发中,你还需要考虑错误处理、用户体验优化以及跨域、安全性等问题...

    js截取div并输出为图片

    4. 创建`img`元素,设置其`src`为生成的URL,显示截取的图片。 5. 提供下载功能,用户可以点击按钮将图片保存到本地。 对于那些寻找如何在JavaScript中截取`div`并生成图片的开发者来说,这个项目提供了一个有价值...

    基于jquery的图片截取工具

    在网页开发中,图片截取功能常常用于用户上传图片并裁剪为特定尺寸,以便适应网站的布局或者作为头像等用途。基于jQuery的图片截取工具就是为了解决这个问题而设计的,它允许开发者轻松地集成到项目中,提供用户友好...

    jQuery图片等比例缩放截取显示代码.zip

    "jQuery图片等比例缩放截取显示代码" 是一种解决图片在不同尺寸屏幕下不失真的技术,它利用jQuery库和一个名为jQThumb的插件实现。这里我们将深入探讨这个技术的工作原理、实现方式以及其优势。 首先,jQuery是一个...

    截取屏幕图片.html

    客户端截取页面内容,转为图片并显示。

    java用ffmpeg截取视频图片

    运行 `main` 方法,将会从指定的视频文件中截取首帧图片并保存到指定路径。 对于更复杂的操作,如视频剪辑或转换,可以通过调整 FFmpeg 的参数来实现。例如,如果要剪辑视频的一部分,可以使用 `-ss` 参数设定开始...

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

    总的来说,截取图片的指定部分是iOS开发中常见的图像处理任务,通过理解并运用Core Graphics框架,我们可以灵活地实现这一功能。如果你在项目中遇到了这类需求,可以参考这个“ios-截取图片指定部分.zip”文件中的...

    applet截取屏幕图片

    以下是一个简单的Applet类,用于截取指定区域的屏幕并保存为图片: ```java import java.awt.*; import java.awt.image.BufferedImage; import javax.swing.JApplet; import java.io.File; import java.io....

    MFC截取窗体图片并保存BMP

    在本文中,我们将深入探讨如何在Visual Studio 2010环境下使用Microsoft Foundation Classes (MFC)库来截取窗体图像并将其保存为BMP文件。BMP(Bitmap)是一种常见的位图图像文件格式,它包含像素颜色信息,不进行...

    iOS uiimage部分截取图片

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

Global site tag (gtag.js) - Google Analytics