Erste 0 Werte für RGB, wenn Änderungen der Pixel in einem CGImageRef Daten versuchen

StackOverflow https://stackoverflow.com/questions/4265725

  •  27-09-2019
  •  | 
  •  

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;

}

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top