首先创建一个UIImage类别,如下:
@interface UIImage(UIImageScale)
-(UIImage*)getSubImage:(CGRect)rect;
-(UIImage*)scaleToSize:(CGSize)size;
@end
@implementation UIImage(UIImageScale)
//截取部分图像
-(UIImage*)getSubImage:(CGRect)rect
{
CGImageRef subImageRef = CGImageCreateWithImageInRect(self.CGImage, rect);
CGRect smallBounds = CGRectMake(0, 0, CGImageGetWidth(subImageRef), CGImageGetHeight(subImageRef));
UIGraphicsBeginImageContext(smallBounds.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextDrawImage(context, smallBounds, subImageRef);
UIImage* smallImage = [UIImage imageWithCGImage:subImageRef];
UIGraphicsEndImageContext();
return smallImage;
}
//等比例缩放
-(UIImage*)scaleToSize:(CGSize)size
{
CGFloat width = CGImageGetWidth(self.CGImage);
CGFloat height = CGImageGetHeight(self.CGImage);
float verticalRadio = size.height*1.0/height;
float horizontalRadio = size.width*1.0/width;
float radio = 1;
if(verticalRadio>1 && horizontalRadio>1)
{
radio = verticalRadio > horizontalRadio ? horizontalRadio : verticalRadio;
}
else
{
radio = verticalRadio < horizontalRadio ? verticalRadio : horizontalRadio;
}
width = width*radio;
height = height*radio;
int xPos = (size.width - width)/2;
int yPos = (size.height-height)/2;
// 创建一个bitmap的context
// 并把它设置成为当前正在使用的context
UIGraphicsBeginImageContext(size);
// 绘制改变大小的图片
[self drawInRect:CGRectMake(xPos, yPos, width, height)];
// 从当前context中创建一个改变大小后的图片
UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext();
// 使当前的context出堆栈
UIGraphicsEndImageContext();
// 返回新的改变大小后的图片
return scaledImage;
}
@end
然后在下面方法里面调用就可以了!
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://img21.mtime.cn/mg/2011/09/24/112524.53149978.jpg"]] ];
// 裁剪图片
//image = [image getSubImage:CGRectMake(10, 10, 70, 80)];
//等比列缩放
image = [image scaleToSize:CGSizeMake(200, 300)];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
[self.window addSubview:imageView];
NSLog(@"image.size:%@",NSStringFromCGSize(CGSizeMake(imageView.image.size.width, imageView.image.size.height))); //打印获取的网络图片的宽度和高度
[self.window makeKeyAndVisible];
return YES;
}
//--------------截取部分图片到指定位置-------------------------
图片(UIImage*) img
要截取的起始坐标sx:(int) sx1 sy:(int)sy1
要截取的长度和宽度sw:(int) sw1 sh:(int) sh1
最终要显示的坐标desx:(int) desx1 desy:(int)desy1
-(UIImage*)objectiveDrawRegion:(UIImage*) img sx:(int) sx1 sy:(int)sy1 sw:(int) sw1 sh:(int) sh1 desx:(int) desx1 desy:(int)desy1{
[self saveImage:img name:@"objectiveDrawRegion1.png"];
//创建图片缓冲
void *imageDataRegion=malloc(screenWidth*screenHeight*32);
CGColorSpaceRef iColorSpaceRegion=CGColorSpaceCreateDeviceRGB();
CGContextRefiDeviceRegion=CGBitmapContextCreate(imageDataRegion,screenWidth,screenHeight,8,4*screenWidth,iColorSpaceRegion,kCGImageAlphaPremultipliedLast);
//剪切区域
CGRect clipRegion=CGRectMake(sx1,sy1,sw1,sh1);
CGContextClipToRect(iDeviceRegion, clipRegion);
CGFloat widthf=img.size.width;
CGFloat heightf=img.size.height;
CGRect cg=CGRectMake(0.0, 0.0, widthf, heightf);
//画底图
CGContextDrawImage(iDeviceRegion,cg, img.CGImage);
//将缓冲形成图片
CGImageRef ioffRegion=CGBitmapContextCreateImage(iDeviceRegion);
CGRect cg1=CGRectMake(desx1, desy1, sw1, sh1);
UIImage *ui=[UIImage imageWithCGImage:ioffRegion];
CGContextDrawImage(当前context,cg1, ui.CGImage);
//清除缓冲
CGColorSpaceRelease(iColorSpaceRegion);
CGContextRelease(iDeviceRegion);
CGImageRelease(ioffRegion);
free(imageDataRegion);
// iDeviceRegion=NULL;
// imageDataRegion=0;
return ui;
}
分享到:
相关推荐
综上所述,自定义裁剪和图片缩放功能涉及多个iOS开发的关键知识点,包括UIKit组件的使用、手势识别、图形上下文操作等。实现这样的功能不仅提高了应用的用户体验,也为用户提供更多个性化编辑的可能。在实际开发中,...
10. 方法实现:在实现部分,添加了对称的实现方法roundToSize:corner:和scaleToSize:,这些方法都是UIImage扩展的一部分,用于具体实现图片的圆角和缩放功能。 由于原始文档部分文字是通过OCR扫描生成的,因此在...
OC Extension UIImage+FHXImage(图片扩展) 针对UIImage进行封装的工具类。 /** 输入图片颜色返回一张图片 */ + (UIImage *)createImageWithColor:(UIColor *)color; /** 裁切图片的一个点进行延伸 */ - ...
SwiftGif通过扩展UIImage类,添加了加载和播放GIF的能力,使得开发者能够无缝地处理这种流行的动画格式。其主要功能包括: 1. **GIF加载**:SwiftGif能够解析GIF文件,并将其转化为一系列连续的UIImage对象,这使得...
这个"UIImage+Sprite for iOS"的源码库显然扩展了UIImage类,增加了精灵(Sprite)功能,这通常用于2D游戏或者需要高效处理多帧动画的场景。在iOS应用中,精灵是一种常用的图形管理技术,它将多个小图像组合成一个大...
UIImage Category是一种优雅的方式,可以扩展UIImage的功能,无需修改原生类,方便地实现水印功能。本教程将深入讲解如何通过Category实现UIImage的水印功能。 首先,让我们了解Category的概念。Category是...
UIImage类是iOS中处理图片的主要接口,它提供了缩放图片的方法。例如,`-[UIImage imageWithCGImage:scale:orientation:]`可以根据给定的CGImage、缩放比例和方向创建新的UIImage实例。 5. 并行处理与GCD(Grand ...
缩放分为两种常见的类型:指定大小缩放和等比缩放。指定大小缩放是指将图片强制调整到特定尺寸,可能会改变图片的原始比例。等比缩放则保持图片的比例,防止拉伸或压缩。 对于指定大小缩放,我们可以使用以下代码:...
接着,使用`CGPDFPageGetDrawingTransform`获取页面的变换矩阵,以便正确地缩放和裁剪页面到`UIImage`的大小。最后,使用`UIGraphicsBeginImageContext`创建一个新的图形上下文,将PDF页面绘制到这个上下文中,然后...
UI 图片处理是 iOS 开发中一个非常重要的topic,UIImage 是 iOS 中表示图像的类,它提供了多种方法来处理图像,在这里我们将介绍 UIImage 图片处理的四种方法:截图、缩放、设定大小和存储。 截图 截图是将 UIView...
在iOS开发中,图片的裁剪、抠图和比例裁剪是常见的图像处理需求,尤其在用户需要上传头像或自定义图片时。本篇将详细介绍如何使用Objective-C(OC)语言来实现这些功能。 首先,我们要理解iOS中处理图片的基础类`...
"OGImageExtensions"的文档详细介绍了每个扩展方法的用途和用法,帮助开发者快速理解和应用。这些方法覆盖了图像的加载、处理、转换等多个方面,比如: 1. **异步加载图片**:这个扩展可能包含从网络、文件系统或者...
5. **图片缩放与裁剪**: 如果图片尺寸过大,需要进行适当的缩放以节省内存和提高显示速度。UIImage提供了`resize`和`scaleToSize:`方法,可以调整图片大小。对于特定显示区域,可能还需要裁剪图片。 6. **动画展示*...
5. 裁剪图片:在用户完成裁剪后,使用`CGContext`和计算好的坐标变换裁剪图片,得到新的`CGImage`,再转换成`UIImage`。 在代码实现时,可以创建一个专门的`CropViewController`,将裁剪逻辑封装在这个控制器中。...
当你需要对图片进行颜色调整或添加遮罩效果时,可以利用UIKit框架中的各种方法和属性来实现。下面将详细介绍如何改变UIImage的颜色以及如何应用遮罩。 1. 改变UIImage颜色: - 使用`UIImageRenderingMode....
这个类扩展了`UIImage`,增加了精灵(Sprite)和动画功能,让开发者能够更灵活地创建和控制游戏或应用中的动态图像。`UIImage+Sprite+Additions`可能是这个库或框架的名称,它提供了一些类别方法来增强原生`UIImage`...
标题提到的"ios UIImage category 图片加载"是关于如何通过分类扩展`UIImage`类,以提供更高效的图片加载策略。描述中特别提到了避免使用`imageNamed:`方法,因为这种方法在某些情况下可能会导致内存压力增大。 ...
4. **UIImage和UIImageView**:在iOS中,UIImage用于存储和显示图片,而UIImageView则用于在屏幕上展示UIImage对象。开发者需要使用这些类来加载和显示Facebook照片。 5. **UIPagination**:为了实现图片浏览器功能...
UIImage是苹果iOS SDK中的一个基础类,用于处理和显示图片资源。在这个项目中,开发者为UIImage添加了额外的功能,使其能更好地适应游戏开发的需求。 UIImage通常用于加载和显示静态图像,但在游戏中,为了实现动态...
在IT领域,手动截图和裁剪图片是常见的图像处理操作,尤其在移动设备和桌面应用中广泛使用。本文将深入探讨这一主题,介绍如何实现这一功能,并涉及相关的技术点。 首先,手动截图功能通常涉及到操作系统级别的API...