Я пытаюсь сделать что-то очень простое:
1) Изобразить UIImage в контекст растрового изображения CG
2) Получить указатель на данные изображения
3) перебрать все пиксели и просто установить все компоненты RGB на 0 и альфа на 255. Результат должен выглядеть чисто черным.
Это исходное изображение, которое я использую.200 x 40 пикселей, PNG-24 ARGB с предварительным умножением альфа (все значения альфа == 255):
Это результат (скриншот)из симулятора), когда я не изменяю пиксели.Выглядит хорошо:
Это результат, когда я делаю модификации!Похоже, что модификация была неполной. Но циклы for прошли КАЖДЫЙ один пиксель.Счетчик доказывает это: консоль сообщает о модифицированных пикселях = 8000, что в точности равно 200 х 40 пикселей.Он всегда выглядит одинаково.
Примечание. Используемое изображение PNG не имеет альфа <255. Так что прозрачных пикселей нет. </p>
Вот как я создаю контекст.Ничего особенного ...
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];
Вопрос:
Что я делаю не так?
Это происходит потому, что я изменяю данные, перебирая их?Должен ли я дублировать это?