On Jun 1, 2010, at 2:16 PM, David Duncan wrote:

> On May 31, 2010, at 5:40 PM, Robert Lorentz wrote:
> 
>> What I REALLY want to achieve (this can be poor performance): take a JPG (or 
>> PNG is great too) file on disk, result with a float *bytes; array holding 
>> the floating point precision data from the JPG as R G B A format. Anything 
>> that achieves that is a solution here - my current route is to use CIImage 
>> just because loading up JPG is so easy with it.
> 
> You can use ImageIO to do this, just ask for Floating point precision from 
> your images. This is something that you set with the image source options. 
> Something like this (error checking and mem management missing):

> CGImageSourceRef src = CGImageSourceCreateWithURL(urlToFile, 
> (CFDictionaryRef)[NSDictionary dictionaryWithObject:[NSNumber 
> numberWithBOOL:YES] forKey:(id)kCGImageSourceShouldAllowFloat]);
> CGImageRef img = CGImageSourceCreateAtIndex(src, 0);
> 

OK This looks more along the lines of what I want to be doing, as opposed to 
having to create contexts and draw in to them to get the data, which is awkward 
and seems very backwards.  I follow you as far as creating the CGImageRef -- 
yes, I see how I pull in an image file and dictate to read data in as float as 
opposed to byte-length integers....

However, what do I do with img??  I don't see anything in any of the CG* 
documentation for me getting an array of floats "out of" a CGImageRef.  What 
would the next step be for me to access this data?  Or are you simply 
suggesting this is another way that I can get a JPG in to a data type to then 
write out to a context?

I'm sorry if I didn't mention this before but, while I've read as deeply as I 
can in the docs, I am completely new to cocoa and even more new to 
CG/CI/Quartz/etc

>> // create a CG context, using my float array to hold it's data. Therefore, 
>> IF I draw to it
>> // correctly, I should get rawData filled with the bitmap float data of my 
>> CIImage
>> CGContextRef context = CGBitmapContextCreate(rawData, width, height, 
>> bitsPerComponent, bytesPerRow, colorSpace, kCGBitmapFloatComponents);
> 
> Are you sure the context was actually created? Specifically for float 
> contexts, you need the kCGImageAlpha[Premultilied | None]Last flag as well.

I guess it's being created; CGBitmapContextCreate documentation states for 
return value I either get a bitmap context or NULL if it can't be created... I 
do get a valid pointer returned that I'm able to use.  When using 
KCGImageAlphaPremultipliedLast I get better results .. maybe?  Also I'm now 
using the NSGraphicsContext code suggested by Jens  

00 00 00 00 80 00 00 00 00 00 00 00 00 00 00 00

^^  is repeated for my entire block of memory, after I draw my image on to the 
context.  Definitely not the data I'm expecting.



..My code now looks like:

[.. load up and display CIImage myImage so I can verify it's correct]

CGContextRef context = CGBitmapContextCreate(rawData, width, height, 
bitsPerComponent, bytesPerRow, colorSpace, kCGBitmapFloatComponents | 
kCGImageAlphaPremultipliedLast );
NSGraphicsContext *nsContext = [NSGraphicsContext 
graphicsContextWithGraphicsPort:context flipped: NO];
[NSGraphicsContext saveGraphicsState];
[NSGraphicsContext setCurrentContext: nsContext];       
        
// Should be, and certainly seems to be, drawing to the context created above, 
with data stored in rawData
[myImage drawInRect:[self bounds] fromRect:[self bounds] 
operation:NSCompositeSourceIn fraction:1.0];

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please 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:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to