我想要做的東西很簡單:爲什麼編輯圖像時會出現這些奇怪的結果?
1)繪製一個UIImage成CG位背景
2)獲取的指針圖像
3的數據)遍歷所有像素,並將所有RGB分量設置爲0,並將alpha設置爲255.結果應該顯示爲純黑色。
這是我正在使用的原始圖像。 200×40個像素,PNG-24 ARGB預乘α(所有α值== 255):
這是結果(截圖從模擬器)中,當我不修改像素。看起來不錯:
這是結果,當我做修改!看起來修改是不完整的。但for循環遍歷每個單個像素。計數器證明:控制檯報告modifiedPixels = 8000,這正好是200 x 40像素。它看起來總是完全一樣。
注:我使用的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];
問:
我在做什麼錯?
這是因爲我在修改數據的同時迭代它嗎?我必須複製它嗎?
你確定這是正確的代碼?它將所有內容設置爲255,這應該變成白色。 –
是的,正確的代碼。我忘了在這裏編輯這些值。之前我試圖讓圖像變成白色,但是在白色背景上很難看到示例圖像。所以我把它變成了黑色。 –
代碼使用的是來自malloc()的空白內存,但該示例預先填充了一個圖像,我在想如果圖像不是您認爲的確切格式 – bshirley