Carrés miniature de UIImagePickerViewController image
Dans mon application, l'utilisateur sélectionne une image ou prenez une photo à l'aide de UIImagePickerViewController. Une fois que l'image a été sélectionnée je veux afficher sa vignette sur un carré UIImageView (90x90).
Je suis en utilisant Apple code pour créer une vignette. Le problème est que la vignette n'est pas carré, la fonction, après l'kCGImageSourceThumbnailMaxPixelSize clé à 90, semble uniquement pour redimensionner la hauteur de l'image, et autant que je sache, le kCGImageSourceThumbnailMaxPixelSize clé doit être responsable pour le réglage de la hauteur et la largeur de la miniature.
Voici un aperçu de mon code:
- (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;
}
Et ce comment mon affichage de l'image est instancié:
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];
Si je n'ai pas mis imageView.contentMode = UIViewContentModeScaleAspectFit;
la vignette sera faussée, puisque c'est juste une version de mon image d'origine avec une hauteur de 90 pixels.
Alors, pourquoi est ma vignette pas carré?
Je ne vois pas ce code dans le modifier l'histoire de Clever Erreur de réponse.
stackoverflow.com/posts/17884863/revisions rev "5"
OriginalL'auteur douglasd3 | 2013-07-26
Vous devez vous connecter pour publier un commentaire.
La meilleure chose à faire serait de définir la
contentMode
sur votre imageView êtreUIViewContentModeScaleAspectFill
à la place. Toutefois, cela peut ne pas être idéal, car il permettrait de maintenir l'ensemble de l'image dans la mémoire.Voici un code que j'ai utiliser pour redimensionner les images.
Cette version conservera l'image de la distorsion si la taille n'est pas le même format que l'image.
Souvent vous voulez juste le haut carré d'une image (plutôt que le centre). Et vous voulez que l'image finale pour être d'une certaine taille, dire 128x128, comme dans l'exemple ci-dessous.
J'ai ajouté une version qui ne devrait pas altérer l'image.
Maintenant, il ne déforme pas, mais la vignette de l'image n'est pas au carré, je veux dire, c'est 90x90 mais l'image n'a pas été mis à l'échelle pour remplir la place.
Oups... Le
MIN
doit avoir été unMAX
.et Intelligent Erreur cette réponse est en cours de discussion dans les méta - meta.stackoverflow.com/q/320516/792066
OriginalL'auteur
Voici un lien, vous pouvez vous référer à:
1) UIImage+Redimensionner
2) UIImage+ProportionalFill
Ici vous pouvez redimensionner l'affichage et également ajouter de remplissage proportionnelle de sorte que, proportionnellement, le ratio d'aspect et d'autres fonctions comme le recadrage, le redimensionnement, etc.
Vous pouvez utiliser
-(UIImage*)resizedImageToSize:(CGSize*)size
la méthode de référence lien UIImage+Redimensionner ci-dessus juste pour reize l'image.Espère que cela vous aide.
Laissez-moi savoir si vous souhaitez obtenir de l'aide.
Le deuxième lien est vraiment très utile pour beaucoup de fonctionnalités, comme le cadrage et la mise à l'Échelle.
OriginalL'auteur
Swift version de Clever Erreur de la réponse ci-dessus:
Mise à jour de swift 4.1
OriginalL'auteur
Une autre façon de le faire - a couru dans un problème l'autre jour, et d'autres personnes pourraient avoir le même problème lors de l'utilisation de la apple exemple de code qui est le mieux pour les grandes images.
Comme mentionné dans l'acceptation de réponse, c'est le problème de chargement de l'ensemble de l'image dans la mémoire et iOS peuvent tuer votre application si elle est trop grande. CGImageSourceCreateThumbnailAtIndex d'Apple dans l'exemple de code est plus efficace, cependant il y a un bug dans l'exemple. Le 3ème paramètre de la CFDictionaryCreate est le "numValues" à copier. Doit être 3 pas 2.
UIImage
, parce que vous devez le convertir enCFData
de sorte que vous pouvez utiliserCGImageSourceCreateThumbnailAtIndex
. L'ensemble de ce processus est 15 fois plus lent.OriginalL'auteur