2009-11-20 3 views
4

Dans ce genre de questions one il montre comment utiliser de UIKitstretch PNGs en douceur à Cocoa AppKit

-(UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCapHeight 

pour étirer un PNG facilement, par exemple lors de l'insertion du texte dans une bulle iChat comme. Je voudrais faire la même chose sur AppKit/Cocoa/application de bureau régulière en utilisant CoreGraphics ou une API liée NSImage mais n'a pas pu trouver une méthode équivalente. Est-ce que quelqu'un sait comment faire cela dans AppKit?

+0

NSDrawThreePartImage fonctionne bien, merci Pierre, mais vous devez créer 3 PNGs. Ce n'est pas un gros problème, mais je remarque que beaucoup d'applications ont une bulle png comme une ressource qu'elles étirent d'une manière ou d'une autre, laissant ainsi cela ouvert un peu plus longtemps au cas où quelqu'un connaîtrait une seule technique png. –

+1

Vous pouvez utiliser la technique de Ben Gottlieb pour diviser l'image en trois parties. Créez une nouvelle image vide pour chaque partie, puis dessinez la section correspondante de l'image entière dans chaque image de pièce. –

+1

Vous pouvez également utiliser [Opacity] (http://likethought.com/opacity) pour l'ensemble de l'image et utiliser ses fonctions Factories and Slices pour générer trois fichiers PNG à partir du document Opacity. –

Répondre

7
+0

@ErikAigner: Pas nécessairement manuellement. Plusieurs éditeurs graphiques fournissent des fonctionnalités de «découpe» pour la section automatique de l'image. –

2

Utilisez simplement - [NSImage drawInRect: fromRect: opération: fraction:] et passez NSZeroRect comme fromRect; paramètre.

+0

Est-ce que cela fonctionne pour étirer/lisser une image le long d'un axe? J'ai essayé ceci avec un png et cela n'a pas fonctionné, il a simplement étiré tous les pixels. Je sais qu'il doit y avoir un moyen de le faire avec un png parce que je remarque que beaucoup d'applications ont des pngs simples dans leurs ressources. NSDrawThreePartImage a toutefois fonctionné. –

+0

Btw, j'ai appelé cela comme suit: \t \t \t [speechBubbleImage drawInRect: speechBubbleRect fromRect: opération NSZeroRect: fraction NSCompositeSourceOver: 1.0]; –

2

Voici une fonction i fouetté qui prend 1 image et étend juste milieu ...

enter image description here

-(NSImage *)image:(NSImage *)image leftCapWidth:(float)leftWidth middleWidth:(float)middleWidth rightCapWidth:(float)rightWidth { 

    // Calculate the new images dimensions 
    float imageWidth = leftWidth + middleWidth + rightWidth; 
    float imageHeight = image.size.height; 

    // Generate the left image 
    NSRect rectLeft = NSMakeRect(0, 0, leftWidth, imageHeight); 
    NSImage *imageLeft = [[NSImage alloc] initWithSize:rectLeft.size]; 
    if (imageLeft.size.width > 0) { 
     [imageLeft lockFocus]; 
     [image drawInRect:rectLeft fromRect:rectLeft operation:NSCompositeCopy fraction:1.0]; 
     [imageLeft unlockFocus]; 
    } 

    // Generate the middle image 
    NSRect rectMiddle = NSMakeRect(0, 0, image.size.width - (rightWidth + leftWidth), imageHeight); 
    NSImage *imageMiddle = [[NSImage alloc] initWithSize:rectMiddle.size]; 
    if (imageMiddle.size.width > 0) { 
     [imageMiddle lockFocus]; 
     [image drawInRect:rectMiddle fromRect:NSMakeRect(leftWidth, 0, rectMiddle.size.width, imageHeight) operation:NSCompositeCopy fraction:1.0]; 
     [imageMiddle unlockFocus]; 
    } 

    // Generate the right image 
    NSRect rectRight = NSMakeRect(0, 0, rightWidth, imageHeight); 
    NSImage *imageRight = [[NSImage alloc] initWithSize:rectRight.size]; 
    if (imageRight.size.width > 0) { 
     [imageRight lockFocus]; 
     [image drawInRect:rectRight fromRect:NSMakeRect(image.size.width - rightWidth, 0, rightWidth, imageHeight) operation:NSCompositeCopy fraction:1.0]; 
     [imageRight unlockFocus]; 
    } 

    // Combine the images 
    NSImage *newImage = [[[NSImage alloc] initWithSize:NSMakeSize(imageWidth, imageHeight)] autorelease]; 
    if (newImage.size.width > 0) { 
     [newImage lockFocus]; 
     NSDrawThreePartImage(NSMakeRect(0, 0, imageWidth, imageHeight), imageLeft, imageMiddle, imageRight, NO, NSCompositeSourceOver, 1, NO); 
     [newImage unlockFocus]; 
    } 

    // Release the images and return the new image 
    [imageLeft release]; 
    [imageMiddle release]; 
    [imageRight release]; 

    return newImage; 
} 
Questions connexes