UIimage的缩放线程实现安全和非线程安全操作
来源:互联网 发布:gif调色软件 编辑:程序博客网 时间:2024/05/19 05:33
关于图片缩放的线程安全和非线程安全操作.
非线程安全的操作只能在主线程中进行操作,对于大图片的处理肯定会消耗大量的时间,如下面的方法
方法1:使用UIKit
+ (UIImage*)imageWithImage(UIImage*)image scaledToSize(CGSize)newSize;
{
// Create a graphics image context
UIGraphicsBeginImageCont
// Tell the old image to draw in this new context, with thedesired
// new size
[image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
// Get the new image from the context
UIImage* newImage=UIGraphicsGetImageFromCu
// End the context
UIGraphicsEndImageContex
// Return the new image.
return newImage;
此方法很简单,但是,这种方法不是线程安全的情况下.
方法2:使用CoreGraphics
+ (UIImage*)imageWithImage(UIImage*)sourceImage scaledToSize
{
CGFloat targetWidth= targetSize.width;
CGFloat targetHeight= targetSize.height;
CGImageRef imageRef=[sourceImage CGImage];
CGBitmapInfo bitmapInfo=CGImageGetBitmapInfo(imageRef);
CGColorSpaceRef colorSpaceInfo=CGImageGetColorSpace(imageRef);
if (bitmapInfo== kCGImageAlphaNone){
bitmapInfo =kCGImageAlphaNoneSkipLas
}
CGContextRef bitmap;
if (sourceImage.imageOrientation== UIImageOrientationUp|| sourceImage.imageOrientation== UIImageOrientationDown){
bitmap = CGBitmapContextCreate(NULL, targetWidth, targetHeight,CGImageGetBitsPerCompone
} else {
bitmap = CGBitmapContextCreate(NULL, targetHeight, targetWidth,CGImageGetBitsPerCompone
}
if (sourceImage.imageOrientation== UIImageOrientationLeft){
CGContextRotateCTM(bitmap, radians(90));
CGContextTranslateCTM(bitmap,0,-targetHeight);
} else if (sourceImage.imageOrientation== UIImageOrientationRight){
CGContextRotateCTM(bitmap, radians(-90));
CGContextTranslateCTM(bitmap,-targetWidth,0);
} else if (sourceImage.imageOrientation== UIImageOrientationUp){
// NOTHING
} else if (sourceImage.imageOrientation== UIImageOrientationDown){
CGContextTranslateCTM(bitmap, targetWidth, targetHeight);
CGContextRotateCTM(bitmap, radians(-180.));
}
CGContextDrawImage(bitmap,CGRectMake(0,0, targetWidth, targetHeight), imageRef);
CGImageRef ref = CGBitmapContextCreateIma
UIImage* newImage= [UIImage imageWithCGImage:ref];
CGContextRelease(bitmap);
CGImageRelease(ref);
return newImage;
}
这种方法的好处是它是线程安全,加上它负责的 (使用正确的颜色空间和位图信息,处理图像方向)的小东西,UIKit版本不会。
如何调整和保持长宽比(如 AspectFill选项)?
它是非常类似于上述,方法,它看起来像这样:
+ (UIImage*)imageWithImageUIImage*)sourceImagescaledToSizeWithSameAspe
{
CGSize imageSize = sourceImage.size;
CGFloat width = imageSize.width;
CGFloat height = imageSize.height;
CGFloat targetWidth= targetSize.width;
CGFloat targetHeight= targetSize.height;
CGFloat scaleFactor=0.0;
CGFloat scaledWidth= targetWidth;
CGFloat scaledHeight= targetHeight;
CGPoint thumbnailPoint=CGPointMake(0.0,0.0);
if (CGSizeEqualToSize(imageSize, targetSize)==NO) {
CGFloat widthFactor= targetWidth/ width;
CGFloat heightFactor= targetHeight/ height;
if (widthFactor> heightFactor){
scaleFactor =widthFactor;// scale to fit height
}
else {
scaleFactor =heightFactor;// scale to fit width
}
scaledWidth
scaledHeight = height* scaleFactor;
// center the image
if (widthFactor> heightFactor){
thumbnailPoint.y =(targetHeight - scaledHeight)*0.5;
}
else if (widthFactor < heightFactor){
thumbnailPoint.x =(targetWidth - scaledWidth)*0.5;
}
}
CGImageRef imageRef=[sourceImage CGImage];
CGBitmapInfo bitmapInfo=CGImageGetBitmapInfo(imageRef);
CGColorSpaceRef colorSpaceInfo=CGImageGetColorSpace(imageRef);
if (bitmapInfo== kCGImageAlphaNone){
bitmapInfo =kCGImageAlphaNoneSkipLas
}
CGContextRef bitmap;
if (sourceImage.imageOrientation== UIImageOrientationUp|| sourceImage.imageOrientation== UIImageOrientationDown){
bitmap = CGBitmapContextCreate(NULL, targetWidth, targetHeight,CGImageGetBitsPerCompone
} else {
bitmap = CGBitmapContextCreate(NULL, targetHeight, targetWidth,CGImageGetBitsPerCompone
}
// In the right or left cases, we need to switch scaledWidth andscaledHeight,
// and also the thumbnail point
if (sourceImage.imageOrientation== UIImageOrientationLeft){
thumbnailPoint = CGPointMake(thumbnailPoint.y,thumbnailPoint.x);
CGFloat oldScaledWidth= scaledWidth;
scaledWidth =scaledHeight;
scaledHeight =oldScaledWidth;
CGContextRotateCTM(bitmap, radians(90));
CGContextTranslateCTM(bitmap,0,-targetHeight);
} else if (sourceImage.imageOrientation== UIImageOrientationRight){
thumbnailPoint = CGPointMake(thumbnailPoint.y,thumbnailPoint.x);
CGFloat oldScaledWidth= scaledWidth;
scaledWidth =scaledHeight;
scaledHeight =oldScaledWidth;
CGContextRotateCTM(bitmap, radians(-90));
CGContextTranslateCTM(bitmap,-targetWidth,0);
} else if (sourceImage.imageOrientation== UIImageOrientationUp){
// NOTHING
} else if (sourceImage.imageOrientation== UIImageOrientationDown){
CGContextTranslateCTM(bitmap, targetWidth, targetHeight);
CGContextRotateCTM(bitmap, radians(-180.));
}
CGContextDrawImage(bitmap,CGRectMake(thumbnailPoint.x,thumbnailPoint.y, scaledWidth, scaledHeight), imageRef);
CGImageRef ref = CGBitmapContextCreateIma
UIImage* newImage= [UIImage imageWithCGImage:ref];
CGContextRelease(bitmap);
CGImageRelease(ref);
return newImage;
- UIimage的缩放线程实现安全和非线程安全操作
- Java线程安全和非线程安全
- Java线程安全和非线程安全
- Java线程安全和非线程安全
- 线程安全和非线程安全
- Java线程安全和非线程安全
- Java线程安全和非线程安全
- Java线程安全和非线程安全
- Java线程安全和非线程安全
- Java线程安全和非线程安全
- Java线程安全和非线程安全
- Java线程安全和非线程安全
- Java线程安全和非线程安全
- 线程安全和非线程安全
- Java线程安全和非线程安全
- Java线程安全和非线程安全
- Java线程安全和非线程安全
- Java线程安全和非线程安全
- NSNavgationController自定义切换画面(传送参数)
- UItableView实现分页效果(点击more再显示10条)
- 允许对cell进行编辑和拖动
- android手机之间用wifi direct通信
- !!!!!!!!!!!
- UIimage的缩放线程实现安全和非线程安全操作
- android+WM9714(AC97)调试
- ChartDirector 5.0 for python 笔记【5】Side Label Layout
- UIimage扩展-缩放,裁切,改变大小-合并-保存到媒体库
- C#带复选框的日历控件,本人原创
- Ext中tabpanel对面板的添加
- 测试llvm-clang编译器
- MyEclipse连接MySQL的方法
- 境外中国互联网上市公司达到39家