iOS:使用自定义分辨率保存图像

时间:2012-07-11 11:58:26

标签: iphone objective-c ios xcode ipad

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

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 x 320,视网膜为:640 x 640

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

9 个答案:

答案 0 :(得分:16)

您的代码非常接近。您需要做的是以自定义分辨率重新渲染屏幕截图。我修改了你的代码来执行此操作:

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 :(得分: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;
}

答案 2 :(得分: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新分辨率。

希望这是你要找的东西:)

答案 3 :(得分: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;
}

使用此功能可以解决您的问题。

答案 4 :(得分: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

答案 5 :(得分:1)

这对我有用。我尝试使用Facebook SDK获得的图像 http://pulkitgoyal.in/resizing-high-resolution-images-on-ios-without-memory-issues/

答案 6 :(得分:0)

我认为ALAssetRepresentation可以帮到你。

答案 7 :(得分:0)

CGSize sizePic = CGSizeMake(320, 460);
    UIGraphicsBeginImageContext(sizePic);
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *imagePic = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    UIImageWriteToSavedPhotosAlbum(imagePic, nil, nil, nil);

答案 8 :(得分: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;

}