UIImage - 改变颜色深度 - 量化

时间:2015-01-04 16:32:41

标签: ios uiimage

我需要降低UIImage的颜色深度,但我无法弄清楚如何去做。结果应与在Photoshop中应用索引颜色相同。

我的目标是颜色深度较低(32色或更低)。也许这是我的错,但我找不到办法去做。令人惊讶的是,没有CoreImage过滤器。

修改

给你一个提示。

原始图片

enter image description here

期望的结果

enter image description here

编辑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;
}

}

1 个答案:

答案 0 :(得分:0)

我最终使用了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;
    }
}