从调整大小的nsdata处理视网膜图像的正确方法是什么?

时间:2013-04-08 20:19:57

标签: ios uiimage retina-display

当用户从他们的照片库中选择图像时,我正在调整它的大小,然后将其上传到我的服务器,然后在应用程序的其他位置,用户可以查看他们的所有照片。 (我正在简化工作流程)

“详情”屏幕上的uiimageview是320 x 320.根据以下方法我应该使用:

UIImage *image = [UIImage imageWithCGImage:img];

UIImage *image = [UIImage imageWithCGImage:img scale:[UIScreen mainScreen].scale orientation:img.imageOrientation];

B部分将在我请求下载图像(nsdata)时使用imageWithCGIImageimageWithCGIImage:scale:orientation

- (UIImage *)resizedImageForUpload:(UIImage *)originalImage {

  static CGSize __maxSize = {640, 640};

  NSMutableData *data = [[NSMutableData alloc] initWithData:UIImageJPEGRepresentation(originalImage, 1.0)];

  CFMutableDataRef dataRef = (__bridge CFMutableDataRef)data;
  CGImageSourceRef imgSrc  = CGImageSourceCreateWithData(dataRef, NULL);

  CGFloat width = [originalImage maxDimensionForConstraintSize:__maxSize];

  NSNumber *maxWidth    = [NSNumber numberWithFloat:width];
  NSDictionary *options = @{
                            (__bridge NSString *)kCGImageSourceCreateThumbnailFromImageAlways : @YES,
                            (__bridge NSString *)kCGImageSourceCreateThumbnailWithTransform: @YES,
                            (__bridge NSString *)kCGImageSourceThumbnailMaxPixelSize : maxWidth
                            };

  CFDictionaryRef cfOptions     = (__bridge CFDictionaryRef)options;
  CGImageRef img                = CGImageSourceCreateThumbnailAtIndex(imgSrc, 0, cfOptions);
  CFStringRef type              = CGImageSourceGetType(imgSrc);
  CGImageDestinationRef imgDest = CGImageDestinationCreateWithData(dataRef, type, 1, NULL);

  CGImageDestinationAddImage(imgDest, img, NULL);
  CGImageDestinationFinalize(imgDest);

  UIImage *image = [UIImage imageWithCGImage:img];

  CFRelease(imgSrc);
  CGImageRelease(img);
  CFRelease(imgDest);

  return image;
}

1 个答案:

答案 0 :(得分:3)

看来我找到了自己问题的答案。 resizeImageForUpload不应尝试根据设备进行扩展。由于我定义了最大尺寸640,640(我的320,320 uiimageview的视网膜尺寸),因此无需其他操作。我为图像添加了一些缓存,我正在处理缩放:

UIImage *image = [UIImage imageWithData:imgData scale:[UIScreen mainScreen].scale];

然后返回。我之所以认为我搞砸了什么,是因为我试图扩展已经缩放的图像。经验教训。