Вопрос

В настоящее время я делаю основной редактор изображений для iPhone.

я возьму CGImageRef из UIImage и создать контекст для него, используя следующий код

origImage = result.CGImage;

Iheight = CGImageGetHeight(origImage);
Iwidth = CGImageGetWidth(origImage);
IcolorSpace = CGColorSpaceCreateDeviceRGB();
IrawData = malloc(Iheight * Iwidth * 4);
IbytesPerPixel = 4;
IbytesPerRow = IbytesPerPixel * Iwidth;
IbitsPerComponent = 8;
Icontext = CGBitmapContextCreate(IrawData, Iwidth, Iheight, IbitsPerComponent,
                                 IbytesPerRow, IcolorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big
                                 );
//[bytesPerRow release];
CGContextSetBlendMode(Icontext, kCGBlendModeCopy);
CGContextDrawImage(Icontext, CGRectMake(0,0,Iwidth,Iheight),  origImage);

Я тогда петлю через пиксели

for (int x=0; x<Iwidth; x++) {
    for (int y=0; y<Iheight; y++) {
            //and  set the alpha component to 0
            int byteIndex = (y*IbytesPerRow) + x*IbytesPerPixel;

            IrawData[byteIndex+3] = 0;

            }
}

а затем создать CGIMAGEREF из контекста с

    CGImageRef imagea = CGBitmapContextCreateImage(Icontext);

и добавьте CJIMage в Uiimage и назначить UiimageView

Проблема в том, что изменение альфа не влияет на полученное изображение

Если я изменю цвет пикселей с

IrawData[byteIndex+(0/1/2)]

цвет меняется, но Я до сих пор не могу изменить альфа пикселя

Спасибо,

нет нет нет

Это было полезно?

Решение

Не забудьте продемить цвета, прежде чем изменить альфа, и повторно преподавала их позже.

Предопулюдный цвет (часто называемый «преподобный альфа», который вводит в заблуждение) означает, что компоненты цвета хранятся уже умножены на альфа, чтобы облегчить композицию. Обычная работа Compositing (источник) выглядит так:

result = (source.rgb * source.a) + (destination.rgb * (1.0 - destination.a));

Предультерирование означает, что первое умножение уже сделано, поэтому его можно пропустить:

result =  source.rgb             + (destination.rgb * (1.0 - destination.a));

Когда вы меняете альфа, не изменив предовидуемые цветные компоненты, результат не изменяется - когда вы рисуете изображение, он не будет выглядеть отлично, потому что цвета все еще преподаваются старой альфа.

Итак, вам нужно продемипелировать цвета - то есть разделить каждый из альфа (как раньше было умножено, поэтому теперь вы должны сделать обратное) - перед тем, как вы измените альфа. Затем, после смены альфа предоставление цветов новой альфа.

Конечно, это означает, что при изменении альфа до нуля все цвета будут идут черный (R = G = B = 0). Итак, убедитесь, что вы сохраните исходное изображение, если пользователь может захотеть изменить его обратно.

Вероятно, было бы более эффективным, и, безусловно, было бы проще, просто нарисовать исходное изображение (без каких-либо альфа-изменений, сделанных для нее) на любой альфа-пользователю. Вы можете сделать это Изменение вашего дисплея контекста глобальный альфа прежде чем нарисовать изображение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top