gpt4 book ai didi

iphone - 来自 UIImagePickerViewController 图像的方形缩略图

转载 作者:技术小花猫 更新时间:2023-10-29 10:11:36 25 4
gpt4 key购买 nike

在我的应用程序中,用户使用 UIImagePickerViewController 选择图像或拍照。选择图像后,我想在方形 UIImageView (90x90) 上显示其缩略图。

我正在使用 Apple's code创建缩略图。问题是缩略图不是正方形的,这个函数在设置 kCGImageSourceThumbnailMaxPixelSize 键为 90 后,似乎只是调整图像的高度,据我所知 kCGImageSourceThumbnailMaxPixelSize 键应该负责设置缩略图的高度和宽度。

这是我的代码的一瞥:

- (void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info {

UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];

NSData *imageData = UIImageJPEGRepresentation (image, 0.5);

// My image view is 90x90
UIImage *thumbImage = MyCreateThumbnailImageFromData(imageData, 90);

[myImageView setImage:thumbImage];

if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) {

UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
}

[picker dismissViewControllerAnimated:YES completion:nil];
}

UIImage* MyCreateThumbnailImageFromData (NSData * data, int imageSize) {

CGImageRef myThumbnailImage = NULL;
CGImageSourceRef myImageSource;
CFDictionaryRef myOptions = NULL;
CFStringRef myKeys[3];
CFTypeRef myValues[3];
CFNumberRef thumbnailSize;

// Create an image source from NSData; no options.
myImageSource = CGImageSourceCreateWithData((__bridge CFDataRef)data,
NULL);

// Make sure the image source exists before continuing.
if (myImageSource == NULL){
fprintf(stderr, "Image source is NULL.");
return NULL;
}

// Package the integer as a CFNumber object. Using CFTypes allows you
// to more easily create the options dictionary later.
thumbnailSize = CFNumberCreate(NULL, kCFNumberIntType, &imageSize);

// Set up the thumbnail options.
myKeys[0] = kCGImageSourceCreateThumbnailWithTransform;
myValues[0] = (CFTypeRef)kCFBooleanTrue;
myKeys[1] = kCGImageSourceCreateThumbnailFromImageIfAbsent;
myValues[1] = (CFTypeRef)kCFBooleanTrue;
myKeys[2] = kCGImageSourceThumbnailMaxPixelSize;
myValues[2] = thumbnailSize;

myOptions = CFDictionaryCreate(NULL, (const void **) myKeys,
(const void **) myValues, 2,
&kCFTypeDictionaryKeyCallBacks,
& kCFTypeDictionaryValueCallBacks);

// Create the thumbnail image using the specified options.
myThumbnailImage = CGImageSourceCreateThumbnailAtIndex(myImageSource,
0,
myOptions);

UIImage* scaled = [UIImage imageWithCGImage:myThumbnailImage];

// Release the options dictionary and the image source
// when you no longer need them.

CFRelease(thumbnailSize);
CFRelease(myOptions);
CFRelease(myImageSource);

// Make sure the thumbnail image exists before continuing.
if (myThumbnailImage == NULL) {
fprintf(stderr, "Thumbnail image not created from image source.");
return NULL;
}
return scaled;
}

这就是我的 ImageView 的实例化方式:

myImageView = [[UIImageView alloc] init];
imageView.contentMode = UIViewContentModeScaleAspectFit;

CGRect rect = imageView.frame;
rect.size.height = 90;
rect.size.width = 90;

imageView.frame = rect;
[imageView setUserInteractionEnabled:YES];

如果我不设置 imageView.contentMode = UIViewContentModeScaleAspectFit; 缩略图会变形,因为它只是我原始图像的一个版本,高度为 90 像素。

那么,为什么我的缩略图不是正方形的?

最佳答案

最简单的做法是将 imageView 上的 contentMode 设置为 UIViewContentModeScaleAspectFill。然而,这可能并不理想,因为它会将整个图像保存在内存中。

这是我用来调整图像大小的一些代码。

+ (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)size
{
UIGraphicsBeginImageContextWithOptions(size, NO, 0);
[image drawInRect:CGRectMake(0, 0, size.width, size.height)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}

如果尺寸与图像的纵横比不同,此版本将防止图像失真。

+ (UIImage *)imageWithImage:(UIImage *)image scaledToFillSize:(CGSize)size
{
CGFloat scale = MAX(size.width/image.size.width, size.height/image.size.height);
CGFloat width = image.size.width * scale;
CGFloat height = image.size.height * scale;
CGRect imageRect = CGRectMake((size.width - width)/2.0f,
(size.height - height)/2.0f,
width,
height);

UIGraphicsBeginImageContextWithOptions(size, NO, 0);
[image drawInRect:imageRect];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}

通常您只需要图像的顶部正方形(而不是中心)。并且您希望最终图像具有特定大小,例如 128x128,如下例所示。

- (UIImage *)squareAndSmall // as a category (so, 'self' is the input image)
{
// fromCleverError's original
// http://stackoverflow.com/questions/17884555
CGSize finalsize = CGSizeMake(128,128);

CGFloat scale = MAX(
finalsize.width/self.size.width,
finalsize.height/self.size.height);
CGFloat width = self.size.width * scale;
CGFloat height = self.size.height * scale;

CGRect rr = CGRectMake( 0, 0, width, height);

UIGraphicsBeginImageContextWithOptions(finalsize, NO, 0);
[self drawInRect:rr];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}

关于iphone - 来自 UIImagePickerViewController 图像的方形缩略图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17884555/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com