Сделайте изображение RGBA прозрачным и верните его обратно (альтернатива kCGImageAlphaLast) - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь сделать некоторые пиксели прозрачными, а затем на каком-то этапе восстановить их прозрачность.

Прежде всего, мне нужно сделать изображение полностью прозрачным, а затем вернуть его из прозрачного изображения в нормальное состояние, поэтому я начал разработку с нуля, сделав изображение прозрачным (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 внутри проекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...