W mojej aplikacji użytkownik wybiera obraz lub robi zdjęcie za pomocą UIImagePickerViewController. Po wybraniu obrazu chcę wyświetlić jego miniaturę na kwadratowym UIImageView (90x90).Kwadratowa miniatura z UIImagePickerViewController image
Używam Apple's code do utworzenia miniatury. Problem polega na tym, że miniaturka nie jest podniesiona do kwadratu, funkcja, po ustawieniu klawisza kCGImageSourceThumbnailMaxPixelSize na 90, wydaje się zmieniać rozmiar obrazu, i o ile wiem, klucz kCGImageSourceThumbnailMaxPixelSize powinien być odpowiedzialny za ustawienie wysokości i szerokości miniatury.
Oto rzut oka mojego kodu:
- (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;
}
A to, jak moim zdaniem obraz jest tworzony:
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];
Jeśli nie ustawić imageView.contentMode = UIViewContentModeScaleAspectFit;
miniaturka będzie zniekształcony, ponieważ to tylko wersja mojego oryginalnego obrazu o wysokości 90 pikseli.
Dlaczego moja miniatura nie jest kwadratowa?
Uwaga - Meta użytkownik bez wiedzy iOS edytowany dala jakiś super-poręczny kod od odpowiedzi Clever'a poniżej. jeśli faktycznie programujesz i faktycznie potrzebujesz przydatnej odpowiedzi i rzeczywiście chcesz użyć sprytnych pomysłów Clever, po prostu kliknij przycisk "edytowany" poniżej, zobaczysz historię i możesz wycinać, wklejać i wysyłać do sklepu z aplikacjami:) – Fattie
@JoeBlow Nie widzę żadnego usuniętego kodu w [edit history] (http://stackoverflow.com/posts/17884863/revisions) odpowiedzi Clever Error. – cpburnz
http://stackoverflow.com/posts/17884863/revisions rev "5" – Fattie