Hello and thanks for reading! I'm trying to write an NSImage object to a file on the disk but am having trouble as some of the 'image properties' are lost when i extract an NSData object from the original NSImage.
To illustrate the problem I have the below code. The original NSImage object is called 'image' which i pass to imageDump (output at the end), i then extract an NSData object from this in order to write it to file but doing so seems to remove some of the image properties. Again i call imageDump (output again at the end) but this time notice how some of the properties are removed. For example CGImageGetBitsPerPixel: starts at 32 but on the second call to imageDump it's now 24?
How do i prevent these image properties from being removed when i extract the NSData object prior to writing it to disk?
NSLog(@"/n PRINTING THE IMAGE PASSED TO THIS METHOD\n");
[self imageDump:[image CGImageForProposedRect:NULL context:NULL hints:NULL]];
NSData *imageData = [image TIFFRepresentation];
NSImage *montysImage = [[NSImage alloc ] initWithData:imageData];
NSLog(@"/n PRINTING THE IMAGE THAT WAS FIRST CONVERTED TO NSDATA AND THEN BACK\n");
[self imageDump:[montysImage CGImageForProposedRect:NULL context:NULL hints:NULL]];
-(void)imageDump:(CGImageRef)cgimage {
size_t width = CGImageGetWidth(cgimage);
size_t height = CGImageGetHeight(cgimage);
size_t bpr = CGImageGetBytesPerRow(cgimage);
size_t bpp = CGImageGetBitsPerPixel(cgimage);
size_t bpc = CGImageGetBitsPerComponent(cgimage);
size_t bytes_per_pixel = bpp / bpc;
CGBitmapInfo info = CGImageGetBitmapInfo(cgimage);
NSString *file = @"file";
NSLog(
@"\n"
"===== %@ =====\n"
"CGImageGetHeight: %d\n"
"CGImageGetWidth: %d\n"
"CGImageGetColorSpace: %@\n"
"CGImageGetBitsPerPixel: %d\n"
"CGImageGetBitsPerComponent: %d\n"
"CGImageGetBytesPerRow: %d\n"
"CGImageGetBitmapInfo: 0x%.8X\n"
" kCGBitmapAlphaInfoMask = %s\n"
" kCGBitmapFloatComponents = %s\n"
" kCGBitmapByteOrderMask = %s\n"
" kCGBitmapByteOrderDefault = %s\n"
" kCGBitmapByteOrder16Little = %s\n"
" kCGBitmapByteOrder32Little = %s\n"
" kCGBitmapByteOrder16Big = %s\n"
" kCGBitmapByteOrder32Big = %s\n",
file,
(int)width,
(int)height,
CGImageGetColorSpace(cgimage),
(int)bpp,
(int)bpc,
(int)bpr,
(unsigned)info,
(info & kCGBitmapAlphaInfoMask) ? "YES" : "NO",
(info & kCGBitmapFloatComponents) ? "YES" : "NO",
(info & kCGBitmapByteOrderMask) ? "YES" : "NO",
(info & kCGBitmapByteOrderDefault) ? "YES" : "NO",
(info & kCGBitmapByteOrder16Little) ? "YES" : "NO",
(info & kCGBitmapByteOrder32Little) ? "YES" : "NO",
(info & kCGBitmapByteOrder16Big) ? "YES" : "NO",
(info & kCGBitmapByteOrder32Big) ? "YES" : "NO" );
CGDataProviderRef provider = CGImageGetDataProvider(cgimage);
NSData* data = (__bridge id)CGDataProviderCopyData(provider);
//[data autorelease];
const uint8_t* bytes = [data bytes];
printf("Pixel Data:\n");
for(size_t row = 0; row < height; row++)
{
for(size_t col = 0; col < width; col++)
{
const uint8_t* pixel = &bytes[row * bpr + col * bytes_per_pixel];
printf("(");
for(size_t x = 0; x < 3; x++) // 3 WAS -> bytes_per_pixel - changed to remove the alpha component.
{
printf("%.2X", pixel[x]);
if( x < 3 - 1 ) // 3 WAS -> bytes_per_pixel - changed to remove the alpha component.
printf(",");
}
printf(")");
if( col < width - 1 )
printf(", ");
}
printf("\n");
}
}
Console output:
2013-11-06 22:52:01.082 LibraryBuilder[20792:303] /n PRINTING THE IMAGE PASSED TO THIS METHOD 2013-11-06 22:52:01.082 LibraryBuilder[20792:303] ===== file ===== CGImageGetHeight: 6 CGImageGetWidth: 7 CGImageGetColorSpace: <CGColorSpace 0x60000003b840> (kCGColorSpaceICCBased; kCGColorSpaceModelRGB; Color LCD) CGImageGetBitsPerPixel: 32 CGImageGetBitsPerComponent: 8 CGImageGetBytesPerRow: 64 CGImageGetBitmapInfo: 0x00002006 kCGBitmapAlphaInfoMask = YES kCGBitmapFloatComponents = NO kCGBitmapByteOrderMask = YES kCGBitmapByteOrderDefault = NO kCGBitmapByteOrder16Little = NO kCGBitmapByteOrder32Little = YES kCGBitmapByteOrder16Big = YES kCGBitmapByteOrder32Big = NO Pixel Data: (F7,F7,F7), (F7,F7,F7), (F7,F7,F7), (F7,F7,F7), (F7,F7,F7), (EA,D9,C2) (F7,F7,F7), (F7,F7,F7), (F7,F7,F7), (F7,F7,F7), (F7,F7,F7), (F7,F7,F7) (F7,F7,F7), (F7,F7,F7), (F7,F7,F7), (F7,F7,F7), (F7,F7,F7), (F7,F7,F7) (F7,F7,F7), (F7,F7,F7), (F7,F7,F7), (F7,F7,F7), (F7,F7,F7), (F7,F7,F7) (B3,B3,B3), (B3,B3,B3), (B3,B3,B3), (B3,B3,B3), (B3,B3,B3), (B3,B3,B3) (F7,F7,F7), (F7,F7,F7), (F7,F7,F7), (F7,F7,F7), (F7,F7,F7), (F7,F7,F7) (F7,F7,F7), (F7,F7,F7), (F7,F7,F7), (F7,F7,F7), (F7,F7,F7), (F7,F7,F7) 2013-11-06 22:52:01.122 LibraryBuilder[20792:303] /n PRINTING THE IMAGE THAT WAS FIRST CONVERTED TO NSDATA AND THEN BACK 2013-11-06 22:52:01.122 LibraryBuilder[20792:303] ===== file ===== CGImageGetHeight: 6 CGImageGetWidth: 7 CGImageGetColorSpace: <CGColorSpace 0x618000032f40> (kCGColorSpaceICCBased; kCGColorSpaceModelRGB; Color LCD) CGImageGetBitsPerPixel: 24 CGImageGetBitsPerComponent: 8 CGImageGetBytesPerRow: 18 CGImageGetBitmapInfo: 0x00000000 kCGBitmapAlphaInfoMask = NO kCGBitmapFloatComponents = NO kCGBitmapByteOrderMask = NO kCGBitmapByteOrderDefault = NO kCGBitmapByteOrder16Little = NO kCGBitmapByteOrder32Little = NO kCGBitmapByteOrder16Big = NO kCGBitmapByteOrder32Big = NO Pixel Data: (F7,F7,F7), (F7,F7,F7), (F7,F7,F7), (F7,F7,F7), (F7,F7,F7), (C2,D9,EA) (F7,F7,F7), (F7,F7,F7), (F7,F7,F7), (F7,F7,F7), (F7,F7,F7), (F7,F7,F7) (F7,F7,F7), (F7,F7,F7), (F7,F7,F7), (F7,F7,F7), (F7,F7,F7), (F7,F7,F7) (F7,F7,F7), (F7,F7,F7), (F7,F7,F7), (F7,F7,F7), (F7,F7,F7), (F7,F7,F7) (B3,B3,B3), (B3,B3,B3), (B3,B3,B3), (B3,B3,B3), (B3,B3,B3), (B3,B3,B3) (F7,F7,F7), (F7,F7,F7), (F7,F7,F7), (F7,F7,F7), (F7,F7,F7), (F7,F7,F7) (F7,F7,F7), (F7,F7,F7), (F7,F7,F7), (F7,F7,F7), (F7,F7,F7), (F7,F7,F7)