Я пытаюсь сделать некоторые пиксели прозрачными, а затем на каком-то этапе восстановить их прозрачность.
Прежде всего, мне нужно сделать изображение полностью прозрачным, а затем вернуть его из прозрачного изображения в нормальное состояние, поэтому я начал разработку с нуля, сделав изображение прозрачным (Alpha = 0) и вернув его прозрачность обратно в нормальное состояние ( Альфа = 255).
+ (UIImage *)getOpaqueImageFrom:(UIImage *)image {
CGImageRef imageRef = [image CGImage];
NSUInteger width = CGImageGetWidth(imageRef);
NSUInteger height = CGImageGetHeight(imageRef);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
NSUInteger bytesPerPixel = 4;
NSUInteger bytesPerRow = bytesPerPixel * width;
NSUInteger bitsPerComponent = 8;
NSUInteger bitmapByteCount = bytesPerRow * height;
unsigned char *rawData = (unsigned char*) calloc(bitmapByteCount, sizeof(unsigned char));
CGContextRef context = CGBitmapContextCreate(rawData, width, height,
bitsPerComponent, bytesPerRow, colorSpace,
kCGImageAlphaPremultipliedLast);
CGColorSpaceRelease(colorSpace);
CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);
int byteIndex = 0;
while (byteIndex < bitmapByteCount) {
unsigned char red = rawData[byteIndex];
unsigned char green = rawData[byteIndex + 1];
unsigned char blue = rawData[byteIndex + 2];
unsigned char alpha = rawData[byteIndex + 3];
rawData[byteIndex + 3] = 255;
byteIndex += 4;
}
CGImageRef imgref = CGBitmapContextCreateImage(context);
UIImage *result = [UIImage imageWithCGImage:imgref];
CGImageRelease(imgref);
CGContextRelease(context);
free(rawData);
return result;
}
Поэтому в getOpaqueImageFrom я отправлю изображение в формате RGBA (полностью прозрачное изображение).
Допустим,
.... [255, 255, 255, 0] ....
.... [255, 255, 255, 0] ....
.... [255, 255, 255, 0] ....
Но в результате я получу только черное изображение
.... [0, 0, 0, 255] ....
.... [0, 0, 0, 255] ....
.... [0, 0, 0, 255] ....
из-за kCGImageAlphaPremultipliedFirst (так как он предварительно умножил RGBA).
Да, тогда я должен использовать флаг без предварительно умноженного растрового изображения, чтобы получить исходные (не предварительно умноженные) значения RGB, верно?
kCGImageAlphaNone, /* For example, RGB. */
kCGImageAlphaPremultipliedLast, /* For example, premultiplied RGBA */
kCGImageAlphaPremultipliedFirst, /* For example, premultiplied ARGB */
kCGImageAlphaLast, /* For example, non-premultiplied RGBA */
kCGImageAlphaFirst, /* For example, non-premultiplied ARGB */
kCGImageAlphaNoneSkipLast, /* For example, RBGX. */
kCGImageAlphaNoneSkipFirst, /* For example, XRGB. */
kCGImageAlphaOnly /* No color data, alpha data only */
Я выбрал kCGImageAlphaLast, но, в соответствии с документацией Apple Core Graphics * kCGImageAlphaLast в настоящее время не поддерживается на iOS, оставляя только kCGImageAlphaPremultipliedFirst или kCGImageAlphapremPalultis.
Так что я просто хочу найти способ вернуть прозрачное изображение обратно.
Или мне просто нужна альтернатива kCGImageAlphaLast, которую я могу использовать в iOS 11 +
Язык не имеет большого значения, так как я могу использовать swift / obj-c / c ++ или OpenCV внутри проекта.