UIImage - 改变颜色深度 - 量化

UIImage - change color depth - Quantize

我需要降低 UIImage 的颜色深度,但我不知道该怎么做。结果应该与在 Photoshop 中应用索引颜色相同。

我的目标是具有低色深(32 色或更低)。也许这是我的错,但我没有找到解决方法。令人惊讶的是没有 CoreImage 过滤器。

编辑

给你一个提示。

原图

想要的结果

编辑 2

好的,我了解到该过程称为量化(或类似的 :-))。我找到了非常好的源代码 pngnq on sourceforge。虽然它很好,但在较旧的 iPhone 设备上特别慢。但它至少使您的代码保持较小。

ImageMagick 是我发现的另一种选择。我编辑了我的答案,因为我设法让我的代码更短一些。

- (UIImage *) convertImageToIndexed:(UIImage *)image noOfColors:(int)noOfColors withoutTransformation:(BOOL) noTransformation{
UIImage * result;
@autoreleasepool {
    MagickWandGenesis();
    MagickWand * magick_wand = NewMagickWand();
    NSData * dataObject = UIImagePNGRepresentation(image);
    MagickBooleanType status;
    status = MagickReadImageBlob(magick_wand, [dataObject bytes], [dataObject length]);
    if (status == MagickFalse) {
        NSLog(@"OOOOPS");
        return image;
    }

    status = MagickQuantizeImage(magick_wand, noOfColors, MagickGetImageColorspace(magick_wand)  , 0, NO, NO);
    if (status == MagickFalse) {
        NSLog(@"OOOPS");
        return image;
    }

    size_t my_size;
    unsigned char * my_image = MagickGetImageBlob(magick_wand, &my_size);
    NSData * data = [[NSData alloc] initWithBytes:my_image length:my_size];
    free(my_image);
    magick_wand = DestroyMagickWand(magick_wand);
    MagickWandTerminus();
    UIImage * result = [[UIImage alloc] initWithData:data];
    return result;
}

}

我最终使用了 imagemagick wand 库。如何使用 imagemagick 也不明显。我不知道是否有更好的编码方法,因为我既不是编码英雄,也不是 imagemagick 专家。

这是我使用的代码:

- (UIImage *) convertImageToIndexed:(UIImage *)image noOfColors:(int)noOfColors withoutTransformation:(BOOL) noTransformation {
    UIImage * result;
    @autoreleasepool {
        MagickWandGenesis();
        MagickWand * magick_wand = NewMagickWand();
        NSData * dataObject = UIImagePNGRepresentation(image);
        MagickBooleanType status;
        status = MagickReadImageBlob(magick_wand, [dataObject bytes], [dataObject length]);
        if (status == MagickFalse) {
            NSLog(@"OOOOPS");
            return image;
        }

        status = MagickQuantizeImage(magick_wand, noOfColors, MagickGetImageColorspace(magick_wand)  , 0, NO, NO);
        if (status == MagickFalse) {
            NSLog(@"OOOPS");
            return image;
        }

        size_t my_size;
        unsigned char * my_image = MagickGetImageBlob(magick_wand, &my_size);
        NSData * data = [[NSData alloc] initWithBytes:my_image length:my_size];
        free(my_image);
        magick_wand = DestroyMagickWand(magick_wand);
        MagickWandTerminus();
        UIImage * result = [[UIImage alloc] initWithData:data];
        return result;
    }
}