Прозрачность / альфа в контексте COREGRAPHICS (iPhone, OBJC)
-
26-09-2019 - |
Вопрос
В настоящее время я делаю основной редактор изображений для 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). Итак, убедитесь, что вы сохраните исходное изображение, если пользователь может захотеть изменить его обратно.
Вероятно, было бы более эффективным, и, безусловно, было бы проще, просто нарисовать исходное изображение (без каких-либо альфа-изменений, сделанных для нее) на любой альфа-пользователю. Вы можете сделать это Изменение вашего дисплея контекста глобальный альфа прежде чем нарисовать изображение.