2012-07-11 73 views
15

您好我试图捕获一个视图,然后将图像保存为照片库,但我需要为捕获的图像创建一个自定义分辨率,这里是我的代码,但是当应用程序保存图像的分辨率低 !iOS:用自定义分辨率保存图像

UIGraphicsBeginImageContextWithOptions(self.captureView.bounds.size, self.captureView.opaque, 0.0); 

[self.captureView.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage * screenshot = UIGraphicsGetImageFromCurrentImageContext(); 

CGRect cropRect = CGRectMake(0 ,0 ,1435 ,1435); 
CGImageRef imageRef = CGImageCreateWithImageInRect([screenshot CGImage], cropRect); 
CGImageRelease(imageRef); 

UIImageWriteToSavedPhotosAlbum(screenshot , nil, nil, nil); 

UIGraphicsEndImageContext(); 

但在iPhone的分辨率:320×320和视网膜是:640×640

,如果你帮我解决这个问题,我将不胜感激。

+1

[SupportingHiResScreens](http://developer.apple.com/library/ios/#documentation/2DDrawing/Conceptual/DrawingPrintingiOS/SupportingHiResScreens/SupportingHiResScreens.html)> [以编程方式创建高分辨率位图图像](http://developer.apple.com/library/ios/#documentation/2DDrawing/Conceptual/DrawingPrintingiOS/SupportingHiResScreens/SupportingHiResScreens.html#//apple_ref/doc/uid/TP40010156-CH15- SW9) – Bala 2012-07-11 12:02:58

+1

http://stackoverflow.com/a/613576/1059705 – Bala 2012-07-11 12:09:02

+1

您从照片库中选择的图像大小是多少?大于或小于你想要的尺寸(1435,1435)? – holex 2012-07-17 07:50:54

回答

15

您的代码非常接近。你需要做的是重新渲染自定义分辨率的屏幕截图。我修改了你的代码来做到这一点:

UIView* captureView = self.view; 

/* Capture the screen shoot at native resolution */ 
UIGraphicsBeginImageContextWithOptions(captureView.bounds.size, captureView.opaque, 0.0); 
[captureView.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage * screenshot = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

/* Render the screen shot at custom resolution */ 
CGRect cropRect = CGRectMake(0 ,0 ,1435 ,1435); 
UIGraphicsBeginImageContextWithOptions(cropRect.size, captureView.opaque, 1.0f); 
[screenshot drawInRect:cropRect]; 
UIImage * customScreenShot = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

/* Save to the photo album */ 
UIImageWriteToSavedPhotosAlbum(customScreenShot , nil, nil, nil); 

请注意,如果捕获视图不是正方形,那么图像将会失真。保存的图像将始终为正方形和1435x1435像素。

1

首先在UIImage对象中获取图像。创建你的尺寸,你什么都想要和使用以下..

UIImage *image = // you image; 
CGSize size; 
if ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && 
([UIScreen mainScreen].scale == 2.0)) { 

    // RETINA DISPLAY 
     size = CGSizeMake(640, 640); 
} 
else { 
    // Non Ratina device 
     size = CGSizeMake(320, 320); 
} 

UIGraphicsBeginImageContext(size); 
[image drawInRect:CGRectMake(0, 0, size.width, size.height)]; 
UIImage *destImage = UIGraphicsGetImageFromCurrentImageContext();  
UIGraphicsEndImageContext(); 

现在你会得到destImage用新的决议。

希望这是你在找什么:)

+1

320和640分辨率是拍摄的图像分辨率!我需要1435 res在视网膜和非视网膜显示。 – 2012-07-11 12:11:07

+3

这将不会做亲爱的..你可以通过提供的图像和大小将被固定使用'CGSizeMake(1425,1435)'。但是你的图像质量会很差。 – 2012-07-11 12:16:16

+4

只是为了重申Kapil的评论 - 显示屏只能显示320x480或640x960像素。您可以将其渲染为更大的图像,但显示器的像素将被拉伸以填充图像的大小。无法为显示屏上的内容创建更高分辨率的图像。也就是说,如果您显示的高分辨率图像缩小以适合显示器或PDF,则可以将这些图像渲染为更大的图像并获得高分辨率的输出。 – 2012-07-15 15:43:03

7

看看this answer。该代码包括旋转但仍然提问者问同样的问题:“如何从UIImageView以其全分辨率获取图像?”

复制的内容(在删除或任何的情况下):

- (UIImage *)capturedView 
{ 
    float imageScale = sqrtf(powf(self.captureView.transform.a, 2.f) + powf(self.captureView.transform.c, 2.f));  
    CGFloat widthScale = self.captureView.bounds.size.width/self.captureView.image.size.width; 
    CGFloat heightScale = self.captureView.bounds.size.height/self.captureView.image.size.height; 
    float contentScale = MIN(widthScale, heightScale); 
    float effectiveScale = imageScale * contentScale; 

    CGSize captureSize = CGSizeMake(enclosingView.bounds.size.width/effectiveScale, enclosingView.bounds.size.height/effectiveScale); 

    NSLog(@"effectiveScale = %0.2f, captureSize = %@", effectiveScale, NSStringFromCGSize(captureSize)); 

    UIGraphicsBeginImageContextWithOptions(captureSize, YES, 0.0);   
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextScaleCTM(context, 1/effectiveScale, 1/effectiveScale); 
    [enclosingView.layer renderInContext:context]; 
    UIImage *img = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return img; 
} 
1
-(UIImage*)processImageRect:(UIImage*)image:(CGSize)sizeToForm { 
    // Draw image1 
    UIGraphicsBeginImageContext(CGSizeMake(sizeToForm.width, sizeToForm.height)); 
    [image drawInRect:CGRectMake(0.0, 0.0, sizeToForm.width, sizeToForm.height)]; 
    UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext(); 

    return resultingImage; 
} 

搭配这可以解决您的问题。

1

您可以使用:

UIImageExtras.h

@interface UIImage (Extras) 
-(UIImage*)imageByScalingAndCroppingForSize:(CGSize)targetSize; 
@end 

UIImageExtras.m

#import "UIImageExtras.h" 

@implementation UIImage (Extras) 

- (UIImage*)imageByScalingAndCroppingForSize:(CGSize)targetSize 
{ 
//Image de base 
UIImage *sourceImage = self; 
//Image redimenssionnée 
UIImage *newImage = nil; 

//Taille de l'image de base 
CGSize imageSize = sourceImage.size; 
//Longueur et largeur 
CGFloat width = imageSize.width; 
CGFloat height = imageSize.height; 

//Dimension désirée 
CGFloat targetWidth = targetSize.width; 
CGFloat targetHeight = targetSize.height; 

//Echelle... 
CGFloat scaleFactor = 0.0; 
CGFloat scaledWidth = targetWidth; 
CGFloat scaledHeight = targetHeight; 
CGPoint thumbnailPoint = CGPointMake(0.0,0.0); 

//Si taille des image est différentes on redimensionne de facon proportionnelle 
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; 

    //Centre l'image 
    if (widthFactor > heightFactor) 
    { 
     thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5; 
    } 
    else if (widthFactor < heightFactor) 
     { 
      thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5; 
     } 
    }  

    UIGraphicsBeginImageContext(targetSize); 

    CGRect thumbnailRect = CGRectZero; 
    thumbnailRect.origin = thumbnailPoint; 
    thumbnailRect.size.width = scaledWidth; 
    thumbnailRect.size.height = scaledHeight; 

    [sourceImage drawInRect:thumbnailRect]; 

    newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    if(newImage == nil) 
     NSLog(@"could not scale image"); 

    UIGraphicsEndImageContext(); 

    return newImage; 
} 
@end 
0
CGSize sizePic = CGSizeMake(320, 460); 
    UIGraphicsBeginImageContext(sizePic); 
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *imagePic = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    UIImageWriteToSavedPhotosAlbum(imagePic, nil, nil, nil); 
0
#import <ImageIO/ImageIO.h> 
#import <MobileCoreServices/MobileCoreServices.h> 

+ (UIImage *)resizeImage:(UIImage *)image toResolution:(int)resolution { 
NSData *imageData = UIImagePNGRepresentation(image); 
CGImageSourceRef src = CGImageSourceCreateWithData((__bridge CFDataRef)imageData, NULL); 
CFDictionaryRef options = (__bridge CFDictionaryRef) @{ 
                 (id) kCGImageSourceCreateThumbnailWithTransform : @YES, 
                 (id) kCGImageSourceCreateThumbnailFromImageAlways : @YES, 
                 (id) kCGImageSourceThumbnailMaxPixelSize : @(resolution) 
                 }; 
CGImageRef thumbnail = CGImageSourceCreateThumbnailAtIndex(src, 0, options); 
CFRelease(src); 
UIImage *img = [[UIImage alloc]initWithCGImage:thumbnail]; 
return img; 

}