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

嗨,我试图捕捉一个视图,然后作为图像保存到照片库,但我需要创build一个自定义分辨率捕获的图像,这是我的代码,但当应用程序保存图像的分辨率低!

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

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

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

 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); 

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

看看这个答案 。 该代码包括旋转,但提问者问同样的问题:“如何从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; } 

首先在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

希望这是你在找什么:)

 -(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; } 

去这可能会解决你的问题。

你可以使用这个:

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 

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

我认为ALAssetRepresentation可以帮助你。

 CGSize sizePic = CGSizeMake(320, 460); UIGraphicsBeginImageContext(sizePic); [self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage *imagePic = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); UIImageWriteToSavedPhotosAlbum(imagePic, nil, nil, nil); 
 #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; 

}