3

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

“详细信息”屏幕上的 uiimageview 为 320 x 320。基于以下方法,我应该使用:

UIImage *image = [UIImage imageWithCGImage:img];

或者

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

B 部分是当我请求下载图像(nsdata)时我应该使用imageWithCGIImage还是imageWithCGIImage: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;
}
4

1 回答 1

3

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

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

然后返回。我认为我搞砸了的原因是我试图缩放已经缩放的图像。得到教训。

于 2013-04-08T20:40:24.187 回答