繁体   English   中英

UIImage-更改颜色深度-量化

[英]UIImage - change color depth - Quantize

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

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

编辑

给你一个提示。

原始图片

在此处输入图片说明

所需结果

在此处输入图片说明

编辑2

好的,我了解到该过程称为量化(或类似的:-)。 在sourceforge上找到了非常好的源代码pngnq 虽然很好,但在旧版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魔杖库。 两者都不使用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;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM