Почему я получаю эти странные результаты при редактировании изображения? - PullRequest
0 голосов
/ 18 июня 2011

Я пытаюсь сделать что-то очень простое:

1) Изобразить UIImage в контекст растрового изображения CG

2) Получить указатель на данные изображения

3) перебрать все пиксели и просто установить все компоненты RGB на 0 и альфа на 255. Результат должен выглядеть чисто черным.


Это исходное изображение, которое я использую.200 x 40 пикселей, PNG-24 ARGB с предварительным умножением альфа (все значения альфа == 255):

original


Это результат (скриншот)из симулятора), когда я не изменяю пиксели.Выглядит хорошо:

unmodified result


Это результат, когда я делаю модификации!Похоже, что модификация была неполной. Но циклы for прошли КАЖДЫЙ один пиксель.Счетчик доказывает это: консоль сообщает о модифицированных пикселях = 8000, что в точности равно 200 х 40 пикселей.Он всегда выглядит одинаково.

modified result

Примечание. Используемое изображение 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];

Вопрос:

Что я делаю не так?

Это происходит потому, что я изменяю данные, перебирая их?Должен ли я дублировать это?

Ответы [ 2 ]

1 голос
/ 18 июня 2011

Используйте CGBitmapContextGetBytesPerRow (bitmapContext), чтобы получить bytesPerRow вместо получения изображения (изображение имеет только 3 байта на пиксели, если оно не имеет альфа-информации)

1 голос
/ 18 июня 2011

Возможно, вы получаете неправильную высоту или ширину .... и, кстати, 240x40 = 9600, а не 8000, так что это точно, что вы не перебираете каждый пиксель.

...