Stretch PNG seamlessly in Cocoa AppKit

In issues like one , it shows how to use UIKit

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

it is easy to stretch PNG, for example, when you insert text in iChat like a bubble. I would like to do the same in a regular AppKit / Cocoa / desktop application using CoreGraphics or some NSImage-related API, but could not find an equivalent method. Does anyone know how to do this in AppKit?

+4
source share
3 answers

Just use - [NSImage drawInRect: fromRect: operation: fraction:] and pass NSZeroRect as fromRect; Parameter.

+2
source

Here is the i function, whipped, which takes 1 image and stretches only in the middle ...

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; } 
+2
source

All Articles