分享

UIimageView图片自适应大小

 叹落花 2015-01-11
窗口大小获取:    
CGRectscreenBounds = [ [UIScreenmainScreen]bounds];//返回的是带有状态栏的Rect
CGRect rect = [ [UIScreenmainScreen]applicationFrame];//不包含状态栏的Rect
UIImageView:
一 :圆角以及自适应图片大小
   UIImage* image = [UIImage imageNamed:@"image.png"];
   UIImageView* imageView = [[[UIImageView alloc] initWithImage:image] autorelease];
   imageView.frame = CGRectMake(0, 0, 300, 200);
   imageView.layer.cornerRadius = 8;  
   imageView.layer.masksToBounds = YES;
    //自适应图片宽高比例
    imageView1.contentMode = UIViewContentModeScaleAspectFit;
二 图片自适应UIImageView (来源于:http://www./Mobile/iPhone/201103/29636.html)
- (UIImage *)rescaleImageToSize:(CGSize)size {
CGRect rect = CGRectMake(0.0, 0.0, size.width, size.height);
UIGraphicsBeginImageContext(rect.size);
[self drawInRect:rect];  // scales image to rect
UIImage *resImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return resImage;
}
- (UIImage*)imageByScalingAndCroppingForSize:(CGSize)targetSize;   //图片缩放裁剪
- (UIImage*)transformWidth:(CGFloat)width      height:(CGFloat)height; //改变大小
(UIImage *)addImage:(UIImage *)image1 toImage:(UIImage *)image2; //合并图片
(UIImage *)imageFromImage:(UIImage *)image inRect:(CGRect)rect; //裁剪部分图片
(void)imageSavedToPhotosAlbum:(UIImage *)image
didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo;  //保存库图片到媒体
关于图片缩放的线程安全和非线程安全操作.
非线程安全的操作只能在主线程中进行操作,对于大图片的处理肯定会消耗大量的时间,如下面的方法
方法 1:使用 UIKit
(UIImage*)imageWithImageUIImage*)image scaledToSizeCGSize)newSize;
{
// Create a graphics image context
UIGraphicsBeginImageContext(newSize);
// Tell the old image to draw in this new context, with the desired
// new size
[image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
// Get the new image from the context
UIImage* newImage =UIGraphicsGetImageFromCurrentImageContext();
// End the context
UIGraphicsEndImageContext();
// Return the new image.
return newImage;
}
此方法很简单,但是,这种方法不是线程安全的情况下.
方法 2:使用 CoreGraphics
(UIImage*)imageWithImageUIImage*)sourceImage scaledToSizeCGSize)newSize
;
{
CGFloat targetWidth = targetSize.width;
CGFloat targetHeight = targetSize.height;
CGImageRef imageRef =[sourceImage CGImage];
CGBitmapInfo bitmapInfo =CGImageGetBitmapInfo(imageRef);
CGColorSpaceRef colorSpaceInfo =CGImageGetColorSpace(imageRef);
if(bitmapInfo == kCGImageAlphaNone){
bitmapInfo = kCGImageAlphaNoneSkipLast;
}
CGContextRef bitmap;
if(sourceImage.imageOrientation ==UIImageOrientationUp||sourceImage.imageOrientation ==UIImageOrientationDown){
bitmap =CGBitmapContextCreate(NULL, targetWidth, targetHeight,CGImageGetBitsPerComponent(imageRef),CGImageGetBytesPerRow(imageRef), colorSpaceInfo, bitmapInfo
);
}else{
bitmap =CGBitmapContextCreate(NULL, targetHeight, targetWidth,CGImageGetBitsPerComponent(imageRef),CGImageGetBytesPerRow(imageRef), colorSpaceInfo, bitmapInfo
);
}
if(sourceImage.imageOrientation ==UIImageOrientationLeft){
CGContextRotateCTM(bitmap, radians(90));
CGContextTranslateCTM(bitmap,0,-targetHeight);
}elseif(sourceImage.imageOrientation ==UIImageOrientationRight){
CGContextRotateCTM(bitmap, radians(-90));
CGContextTranslateCTM(bitmap,-targetWidth,0);
}elseif(sourceImage.imageOrientation ==UIImageOrientationUp){
// NOTHING
}elseif(sourceImage.imageOrientation ==UIImageOrientationDown){
CGContextTranslateCTM(bitmap, targetWidth, targetHeight);
CGContextRotateCTM(bitmap, radians(-180.));
}
CGContextDrawImage(bitmap,CGRectMake(0,0, targetWidth,targetHeight), imageRef);
CGImageRefref=CGBitmapContextCreateImage(bitmap);
UIImage* newImage =[UIImage imageWithCGImage:ref];
CGContextRelease(bitmap);
CGImageRelease(ref);
return newImage;
}
这种方法的好处是它是线程安全,加上它负责的(使用正确的颜色空间和位图信息,处理图像方向)的小东西,UIKit 版本不会。
如何调整和保持长宽比(如 AspectFill 选项)?
它是非常类似于上述,方法,它看起来像这样:
(UIImage*)imageWithImageUIImage*)sourceImage scaledToSizeWithSameAspectRatioCGSize)targetSize;
{
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  = width * scaleFactor;
scaledHeight = height * scaleFactor;
// center the image
if(widthFactor > heightFactor){
thumbnailPoint.y =(targetHeight - scaledHeight)*0.5;
}
elseif(widthFactor < heightFactor){
thumbnailPoint.x =(targetWidth - scaledWidth)*0.5;
}
}
CGImageRef imageRef =[sourceImage CGImage];
CGBitmapInfo bitmapInfo =CGImageGetBitmapInfo(imageRef);
CGColorSpaceRef colorSpaceInfo =CGImageGetColorSpace(imageRef);
if(bitmapInfo == kCGImageAlphaNone){
bitmapInfo = kCGImageAlphaNoneSkipLast;
}
CGContextRef bitmap;
if(sourceImage.imageOrientation ==UIImageOrientationUp||sourceImage.imageOrientation ==UIImageOrientationDown){
bitmap =CGBitmapContextCreate(NULL, targetWidth, targetHeight,CGImageGetBitsPerComponent(imageRef),CGImageGetBytesPerRow(imageRef), colorSpaceInfo, bitmapInfo
);
}else{
bitmap =CGBitmapContextCreate(NULL, targetHeight, targetWidth,CGImageGetBitsPerComponent(imageRef),CGImageGetBytesPerRow(imageRef), colorSpaceInfo, bitmapInfo
);
}
// In the right or left cases, we need to switch scaledWidth and scaledHeight,
// 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);
}elseif(sourceImage.imageOrientation ==UIImageOrientationRight){
thumbnailPoint =CGPointMake(thumbnailPoint.y, thumbnailPoint.x);
CGFloat oldScaledWidth = scaledWidth;
scaledWidth = scaledHeight;
scaledHeight = oldScaledWidth;
CGContextRotateCTM(bitmap, radians(-90));
CGContextTranslateCTM(bitmap,-targetWidth,0);
}elseif(sourceImage.imageOrientation ==UIImageOrientationUp){
// NOTHING
}elseif(sourceImage.imageOrientation ==UIImageOrientationDown){
CGContextTranslateCTM(bitmap, targetWidth, targetHeight);
CGContextRotateCTM(bitmap, radians(-180.));
}
CGContextDrawImage(bitmap,CGRectMake(thumbnailPoint.x,thumbnailPoint.y, scaledWidth, scaledHeight), imageRef);
CGImageRefref=CGBitmapContextCreateImage(bitmap);
UIImage* newImage =[UIImage imageWithCGImage:ref];
CGContextRelease(bitmap);
CGImageRelease(ref);
return newImage;
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多