Erste 0 Werte für RGB, wenn Änderungen der Pixel in einem CGImageRef Daten versuchen
Frage
Hallo Leute, ich bin immer 0 für RGB-Werte in diesem Code. Jede Idee, warum? Die inimage wurde mit dieser CGContext erstellt.
-(CGContextRef)createBitmapContextWide:(int) pixelsWide Height:(int) pixelsHigh{
CGContextRef context = NULL;
CGColorSpaceRef colorSpace;
void * bitmapData;
int bitmapByteCount;
int bitmapBytesPerRow;
bitmapBytesPerRow = (pixelsWide * 4);
bitmapByteCount = (bitmapBytesPerRow * pixelsHigh);
colorSpace = CGColorSpaceCreateDeviceRGB();
bitmapData = malloc( bitmapByteCount );
if (bitmapData == NULL)
{
fprintf (stderr, "Memory not allocated!");
return NULL;
}
context = CGBitmapContextCreate (bitmapData,
pixelsWide,
pixelsHigh,
8, // bits per component
bitmapBytesPerRow,
colorSpace,
kCGImageAlphaPremultipliedLast);
if (context== NULL)
{
free (bitmapData);
fprintf (stderr, "Context not created!");
return NULL;
}
CGColorSpaceRelease( colorSpace );
return context;
}
-Code, dass Änderungen Pixelfarben (oder sollte es ändern)
-(UIImage*)convertGrayScaleImageRedImage:(CGImageRef)inImage{
CFDataRef m_DataRef = CGDataProviderCopyData(CGImageGetDataProvider(inImage));
UInt8 * m_PixelBuf = (UInt8 *) CFDataGetBytePtr(m_DataRef);
int length = CFDataGetLength(m_DataRef);
for (int i=0; i<length; i+=4){
int r = i;
int g = i+1;
int b = i+2;
//int a = i+3;//alpha
NSLog(@"r=%i, g=%i, b=%i",m_PixelBuf[r], m_PixelBuf[g], m_PixelBuf[b]);
m_PixelBuf[r] = 1;
m_PixelBuf[g] = 0;
m_PixelBuf[b] = 0;
//m_PixelBuf[a] = m_PixelBuf[a];//alpha
}
CGContextRef ctx = CGBitmapContextCreate(m_PixelBuf,
CGImageGetWidth(inImage),
CGImageGetHeight(inImage),
CGImageGetBitsPerComponent(inImage),
CGImageGetBytesPerRow(inImage),
CGImageGetColorSpace(inImage),
CGImageGetBitmapInfo(inImage)
);
CGImageRef imageRef = CGBitmapContextCreateImage(ctx);
CGContextRelease(ctx);
UIImage *redImage = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
return redImage;
}
Lösung
Ok, also, wenn Sie Probleme mit Pixel manipultion auf einer Bitmap können Sie in considiration Ihre Bitmaps Format zu übernehmen (32bit? 16bit?) ARGB oder RGBA oder CMYK
Tipp: : Wenn Sie überprüfen wollen, was Format Bitmap in Versuch 1 für die erste Byte setzen, 0, für das zweite Byte und 0 für das dritte Byte.
m_PixelBuf[i] = 1;
m_PixelBuf[i+1] = 0;
m_PixelBuf[i+2] = 0;
Auf diese Weise, wenn Sie alle Pixel rot bekommen Sie Ihr Format kennen, ist RGBA. Spielen Sie mit ihm und in wenigen Minuten werden Sie es herausfinden. Es ist wahrscheinlich einfacher Weg, aber ich bin ein noob: -)
In meinem Fall mein Bild war RGBA, aber alle Pixel, bei denen seit dem CGImageRef (inimage) in der Alpha-Bit gespeichert war transparent mit Graustufen-Schatten.
Fazit
Code ist richtig, aber meine Kenntnisse der Eingabe-Bitmap-Format falsch war.