2013-03-10 1 views
-1

J'ai une ressource (fichier .png) qui affiche un cadre d'image (bordure).
Ce fichier .png a une taille de 100x100px et une largeur de bordure de 10px.Objectif c - Problème de redimensionnement UIImage

my original image

Ma question:

Comment puis-je créer une autre UIImage de cette image, avec une taille différente, sans se ruiner la largeur de la frontière?

Le problème:

Lorsque je tente de dessiner la nouvelle image de l'image originale avec CGContextDrawImage je reçois une nouvelle image avec la nouvelle taille, mais ma proportion de la frontière est la ruine.

 CGRect newRect = CGRectIntegral(CGRectMake(0, 0, newWidth, newHeight)); 
     CGImageRef imageRef = //... the image 

     // 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)); 


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

     // Draw into the context; this scales the image 
     CGContextDrawImage(bitmap, 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); 

Par exemple, quand j'ai essayé de créer une taille d'image 800x100p, je reçois une image en haut et très mince bordure inférieure.

the bad result I get

Ce que j'ai besoin est que la frontière restera la même largeur
enter image description here

* Remarque
En utilisant resizableImageWithCapInsets: me aidera pas, parce que je besoin d'une nouvelle image avec la nouvelle taille enregistrer sur le disque.

+1

Est-ce que ce doit être une ressource? Je suis sûr qu'il y a un moyen d'ajouter des bordures avec la largeur et la couleur par programme. Je suppose que ce n'est pas une option pour vous (si vous voulez une bordure personnalisée, etc.), assurez-vous simplement. – Sti

+0

ya que ça doit être .. – Eyal

Répondre

1

Vous pouvez utiliser resizableImageWithCapInsets:

UIImage *img = [UIImage imageNamed:@"myResource"]; 
img = [img resizableImageWithCapInsets:UIEdgeInsetsMake(10,10,10,10)]; 

Je n'ai jamais utilisé cette approche avec CGContextDrawImage, mais il devrait fonctionner.

+0

J'ai besoin d'une nouvelle image avec la nouvelle taille pour mon but .. – Eyal

+0

resizableImageWithCapInsets: va créer une image redimensionnable, qui peut être dessinée dans n'importe quelle taille. –

+0

J'ai essayé cela sans succès ... Vous étiez à droite si j'utilisais une imageview pour présenter l'image, mais j'écris l'image sur le disque, et il semble que l'image resizable n'a aucun effet sur le résultat ... – Eyal