当用户从他们的照片库中选择图像时,我正在调整它的大小,然后将其上传到我的服务器,然后在应用程序的其他位置,用户可以查看他们的所有照片。 (我正在简化工作流程)
“详情”屏幕上的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;
}
答案 0 :(得分:3)
看来我找到了自己问题的答案。 resizeImageForUpload
不应尝试根据设备进行扩展。由于我定义了最大尺寸640,640(我的320,320 uiimageview的视网膜尺寸),因此无需其他操作。我为图像添加了一些缓存,我正在处理缩放:
UIImage *image = [UIImage imageWithData:imgData scale:[UIScreen mainScreen].scale];
然后返回。我之所以认为我搞砸了什么,是因为我试图扩展已经缩放的图像。经验教训。