2010-03-08 10 views
1

Je développe une application iPhone qui redimensionne et fusionne les images.iPhone: comment conserver la taille de l'image originale tout en modifiant les images

Je souhaite sélectionner deux photos de taille 1600x1200 dans la photothèque, puis les fusionner en une seule image et enregistrer cette nouvelle image dans la photothèque.

Cependant, je ne peux pas obtenir la bonne taille pour l'image fusionnée.

Je prends deux vues d'image de l'image 320x480 et définissez l'image de la vue à mes images importées. Après avoir manipulé les images (zoom, recadrage, rotation), je sauvegarde l'image dans l'album. Quand je vérifie la taille de l'image, il montre 600x800. Comment puis-je obtenir la taille d'origine de 1600 * 1200?

J'ai été bloqué sur ce problème de deux semaines!

Merci d'avance.

+0

question est probablement trop vague pour y répondre - essayez le mode d'être –

+0

détaillées et spécifiques merci pour la réponse, j'utilise deux images de taille 1200 * 1600. pour la compatibilité d'iphone je prends des vues d'image de 320 * 480 pour montrer les deux images ... Après cela je dessine une nouvelle image de ces deux images son obtention de 320 * 480 par taille mais j'ai besoin de sa taille originale de la taille 1200 * 1600 comment puis-je avoir. actuellement en train de redimensionner l'image au format 1200 * 1600, mais cela me donne une image floue. – Madhu

Répondre

0

Résolu comme suit.

UIView *bgView = [[UIView alloc] initwithFrame:CGRectMake(0, 0, 1600, 1200)]; 
UIGraphicsBeginImageContext(tempView.bounds.size); 
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
UIImageWriteToSavedPhotosAlbum(viewImage, self, nil, nil); 

Merci pour votre soutien pour résoudre la question

0

Le cadre de l'UIImageView n'a rien à voir avec la taille de l'image qu'il affiche. Si vous affichez un pixel 1200 x 1600 dans une image 75 x 75, la taille de l'image en mémoire est toujours de 1200 x 1600. Quelque part dans le traitement de l'image, vous réinitialisez sa taille.

Vous devez redimensionner les images par programme dans les coulisses et ignorer leur mode d'affichage. Pour la plus haute fidélité, je suggère de préformer tous les traitements sur l'image en taille réelle et de ne redimensionner que le résultat final. Pour une utilisation rapide et peu gourmande en mémoire, redimensionnez d'abord les plus petits, traitez-les, puis redimensionnez-les au besoin.

J'utilise Trevor Harmon's UIImage+Resize pour redimensionner des images.

Sa méthode de base ressemble à ceci:

- (UIImage *)resizedImage:(CGSize)newSize 
       transform:(CGAffineTransform)transform 
      drawTransposed:(BOOL)transpose 
    interpolationQuality:(CGInterpolationQuality)quality 
{ 
    CGRect newRect = CGRectIntegral(CGRectMake(0, 0, newSize.width, newSize.height)); 
    CGRect transposedRect = CGRectMake(0, 0, newRect.size.height, newRect.size.width); 
    CGImageRef imageRef = self.CGImage; 

    // Build a context that's the same dimensions as the new size 
    CGContextRef bitmap = CGBitmapContextCreate(NULL, 
               newRect.size.width, 
               newRect.size.height, 
               CGImageGetBitsPerComponent(imageRef), 
               0, 
               CGImageGetColorSpace(imageRef), 
               CGImageGetBitmapInfo(imageRef)); 

    // Rotate and/or flip the image if required by its orientation 
    CGContextConcatCTM(bitmap, transform); 

    // Set the quality level to use when rescaling 
    CGContextSetInterpolationQuality(bitmap, quality); 

    // Draw into the context; this scales the image 
    CGContextDrawImage(bitmap, transpose ? transposedRect : newRect, imageRef); 

    // Get the resized image from the context and a UIImage 
    CGImageRef newImageRef = CGBitmapContextCreateImage(bitmap); 
    UIImage *newImage = [UIImage imageWithCGImage:newImageRef]; 

    // Clean up 
    CGContextRelease(bitmap); 
    CGImageRelease(newImageRef); 

    return newImage; 
} 

Harmon m'a sauvé des dizaines d'heures de travail en essayant d'obtenir Redimensionnement fait correctement.

+0

merci pour la réponse, je fais aussi pareil de cette façon .. le traitement de tout le code dans les images redimensionnées et après cela à nouveau le redimensionner. Mais cela donne du flou à l'image ... mais l'image n'a pas besoin de perdre sa qualité d'origine. – Madhu

+0

Si vous redimensionnez l'image logique (par opposition à l'affichage), vous perdrez inévitablement de la résolution car l'algorithme de redimensionnement doit effectuer une interpolation/extrapolation rétrécir/agrandir l'image. Ce faisant, il détruit certaines des informations qui ont défini l'image à l'origine. – TechZen

+0

Lorsque vous décidez de l'ordre d'effectuer un traitement graphique à la plus haute fidélité, vous devriez aller dans les séquences les moins altérées au maximum. E.g Composite -> crop -> rotate -> scale -> redimensionner. – TechZen