2010-11-24 7 views
2

こんにちは、このコードではRGB値が0になっています。どんな考え? inImageはこのCGContextで作成されました。CGImageRefデータのピクセルを変更しようとするとRGB値が0になる

-(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; 

}

ピクセルの色を変更する(または、それは変更する必要があります)コード

-(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; 

}

+0

問題が解決しました。問題はありません:-)画像はアルファ値のみで作られていたので、RGBの値は0になりました。 – Cyprian

答えて

1

オクラホマので、あなたはビットマップ上のピクセルmanipultionに問題がある場合は、かもしれませんあなたのビットマップ形式(32ビット?16ビット?)を考慮に入れたいARGB or RGBA or CMYK

ヒント:ビットマップのフォーマットを確認する場合は、最初のバイトに1を、2番目のバイトに0を、3番目のバイトに0を入れてみてください。

m_PixelBuf[i] = 1; 
m_PixelBuf[i+1] = 0; 
m_PixelBuf[i+2] = 0; 

この方法では、すべてのピクセルが赤色になると、あなたのフォーマットはRGBAとわかります。それと一緒に遊んで、数分でそれを把握します。おそらく簡単な方法がありますが、私はnoobです:-)

私の場合、私の画像はRGBAでしたが、CGImageRef(inImage)からアルファビットに格納されているすべてのピクセルはグレースケールの影で透明でした。

結論
コードは正しいですが、入力されたビットマップ形式の私の知識は間違っていました。

関連する問題