• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: Creating a bitmap of a scaled-down NSImage
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Creating a bitmap of a scaled-down NSImage


  • Subject: Re: Creating a bitmap of a scaled-down NSImage
  • From: Guy English <email@hidden>
  • Date: Mon, 26 Mar 2007 22:14:02 -0400

Sure, basically you want to create a new context and draw the old one into it resized. You kind of do that in a round about way with the offscreen window trick. But we can use an NSImage as the context directly since we can draw into it.

Here's some code (typed into Mail so don't trust it too much):

NSBitmapImageRep *GetNicelySizedBitmapImageRep( NSImage *originalImageFromView )
{
NSImage *image = originalImageFromView;
NSImage *resizedImage = [[NSImage alloc] initWithSize: NSMakeSize ( 512, 512 )];


	[resizedImage lockFocus];

[image drawInRect: NSMakeRect( 0, 0, 512, 512 )
fromRect: NSMakeRect( 0, 0, [image size].width, [image size].height )
operation: NSCompositeSourceOver
fraction: 1.0f];


	[resizedImage unlockFocus];

// resizedImage now contains a 512x512 version of the original image

// get a bitmap image rep from it. there's other ways to do this but this one is guaranteed to work. I think. :)
NSBitmapImageRep *bitmapRep = [NSBitmapImageRep imageRepWithData: [resizedImage TIFFRepresentation]];


	[resizedImage release];

	return bitmapRep;
}

the resulting bitmap rep will be the correct size. It will, however, have been the same as a 'size to fit' scaling in the image view. If you have a non-square original image you want to fiddle the drawInRect param so that it respects the aspect ratio and positions it as you want.

Hope that helps,
Guy


On 26-Mar-07, at 10:05 PM, John Stiles wrote:

Could you explain this in a bit more depth?

On Mar 26, 2007, at 6:58 PM, Guy English wrote:

Hi John,

I may be missing something here but is there a reason you can't just create an NSImage the size you need then draw the captured views image into it using: [capture drawInRect: smallerImageRect fromRect: biggerImageRect operation: NSCompositeSourceOver fraction: 1.0f]; ?

Then get the bitmap image rep from the second, smaller image. It's basically what you're doing with this offscreen window stuff but less convoluted.

Guy

On 26-Mar-07, at 9:53 PM, John Stiles wrote:

Actually, I found one way to do it. It's a bit crude, though. I create an offscreen NSWindow, embed an NSImageView in it, and then set the NSImageView to show my NSImage. The NSImageView knows how to scale down. Then I lock on the NSWindow and use initWithFocusedViewRect on that.

This works, but is there a better way?

Here's a simple code snippet explaining what I mean. It's not perfect—for non-square images, you can see the gray window background surrounding the image—but I assume issues like that can be cleaned up with a little smarts.

NSWindow * s_offscreenWindow = [[[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, 512, 512) styleMask:NSBorderlessWindowMask backing:NSBackingStoreRetained defer:NO] autorelease];
NSImageView * imageView = [[[NSImageView alloc] initWithFrame:NSMakeRect(0, 0, 512, 512)] autorelease];
[imageView setImage:image];
[s_offscreenWindow setContentView:imageView];
[[s_offscreenWindow contentView] display];
[[s_offscreenWindow contentView] lockFocus];
NSBitmapImageRep * bitmap = [[[NSBitmapImageRep alloc] initWithFocusedViewRect:NSMakeRect(0, 0, 512, 512)] autorelease];
[[s_offscreenWindow contentView] unlockFocus];



On Mar 26, 2007, at 6:39 PM, John Stiles wrote:

I have an NSImage that has arrived from an external source that I don't directly control. I need to scale it down and rasterize it to an NSBitmapImageRep—the ultimate goal is to get it into an OpenGL texture, and we have maximum texture-size limits that I need to respect.

The documentation has some very useful code here: http:// developer.apple.com/documentation/Cocoa/Conceptual/ CocoaDrawingGuide/Images/chapter_7_section_5.html#//apple_ref/ doc/uid/TP40003290-CH208-BCICHFGA

The first technique, using initWithFocusedViewRect, works like a charm if I don't need to change the image's size. However, according to the docs, when using this technique, "you cannot scale the content you capture." And unfortunately, I need to support 10.3.9, so the NSView techniques listed don't apply to me.

What is the best approach? There must be a way to scale down the image using the frameworks. I think I could figure out a way to do it by rasterizing the image and then scaling that bitmap down as a separate operation, but I'm thinking there must be a better way.

_______________________________________________

Cocoa-dev mailing list (email@hidden)

Do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
40blizzard.com


This email sent to email@hidden

_______________________________________________

Cocoa-dev mailing list (email@hidden)

Do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
40gmail.com


This email sent to email@hidden

_______________________________________________

Cocoa-dev mailing list (email@hidden)

Do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
40blizzard.com


This email sent to email@hidden


_______________________________________________

Cocoa-dev mailing list (email@hidden)

Do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden


  • Follow-Ups:
    • Re: Creating a bitmap of a scaled-down NSImage
      • From: John Stiles <email@hidden>
References: 
 >Creating a bitmap of a scaled-down NSImage (From: John Stiles <email@hidden>)
 >Re: Creating a bitmap of a scaled-down NSImage (From: John Stiles <email@hidden>)
 >Re: Creating a bitmap of a scaled-down NSImage (From: Guy English <email@hidden>)
 >Re: Creating a bitmap of a scaled-down NSImage (From: John Stiles <email@hidden>)

  • Prev by Date: Re: Creating a bitmap of a scaled-down NSImage
  • Next by Date: Re: Creating a bitmap of a scaled-down NSImage
  • Previous by thread: Re: Creating a bitmap of a scaled-down NSImage
  • Next by thread: Re: Creating a bitmap of a scaled-down NSImage
  • Index(es):
    • Date
    • Thread