2011-06-18 43 views
0

我想要做的東西很簡單:爲什麼編輯圖像時會出現這些奇怪的結果?

1)繪製一個UIImage成CG位背景

2)獲取的指針圖像

3的數據)遍歷所有像素,並將所有RGB分量設置爲0,並將alpha設置爲255.結果應該顯示爲純黑色。


這是我正在使用的原始圖像。 200×40個像素,PNG-24 ARGB預乘α(所有α值== 255):

original


這是結果(截圖從模擬器)中,當我不修改像素。看起來不錯:

unmodified result


這是結果,當我做修改!看起來修改是不完整的。但for循環遍歷每個單個像素。計數器證明:控制檯報告modifiedPixels = 8000,這正好是200 x 40像素。它看起來總是完全一樣。

modified result

注:我使用的PNG圖像沒有alpha < 255.因此,沒有透明像素。


這是我如何創建上下文。沒什麼特別的...

int bitmapBytesPerRow = (width * 4); 
int bitmapByteCount = (bitmapBytesPerRow * imageHeight); 

colorSpace = CGColorSpaceCreateDeviceRGB(); 

bitmapData = malloc(bitmapByteCount); 
bitmapContext = CGBitmapContextCreate(bitmapData, 
       width, 
       height, 
       8, // bits per component 
       bitmapBytesPerRow, 
       colorSpace, 
       CGImageAlphaPremultipliedFirst); 

接下來,我繪製圖像成bitmapContext,並獲取數據是這樣的:

void *data = CGBitmapContextGetData(bitmapContext); 

這是代碼它遍歷像素以修改它們:

size_t bytesPerRow = CGImageGetBytesPerRow(img); 

NSInteger modifiedPixels = 0; 
for (int y = 0; y < height; y++) { 
    for (int x = 0; x < width; x++) { 
     long int offset = bytesPerRow * y + 4 * x; 

     // ARGB 
     unsigned char alpha = data[offset]; 
     unsigned char red = data[offset+1]; 
     unsigned char green = data[offset+2]; 
     unsigned char blue = data[offset+3]; 

     data[offset] = 255; 
     data[offset+1] = 0; 
     data[offset+2] = 0; 
     data[offset+3] = 0; 

     modifiedPixels++; 
    } 
} 

完成後,我獲得了位圖背景下一個新的UIImage和一個UIImageView顯示它,看到的結果:

CGImageRef imageRef = CGBitmapContextCreateImage(bitmapContext); 
UIImage *img = [[UIImage alloc] initWithCGImage:imageRef]; 

問:

我在做什麼錯?

這是因爲我在修改數據的同時迭代它嗎?我必須複製它嗎?

+0

你確定這是正確的代碼?它將所有內容設置爲255,這應該變成白色。 –

+0

是的,正確的代碼。我忘了在這裏編輯這些值。之前我試圖讓圖像變成白色,但是在白色背景上很難看到示例圖像。所以我把它變成了黑色。 –

+0

代碼使用的是來自malloc()的空白內存,但該示例預先填充了一個圖像,我在想如果圖像不是您認爲的確切格式 – bshirley

回答

1

使用CGBitmapContextGetBytesPerRow(bitmapContext)獲得bytesPerRow而不是從圖像獲取(圖像每像素只有3個字節,如果它沒有阿爾法信息)

1

可能你會得到錯誤的高度或寬度....順便說一句240x40 = 9600而不是8000,這樣肯定不會迭代每一個像素。

+0

該死,這是我的問題中的一個錯字。它是200 x 40. –

+0

哦...好吧....然後@Mikhalo是否找到了什麼概念? – Ahmed

相關問題