[英]UIImage - change color depth - Quantize
我需要降低UIImage的颜色深度,但是我不知道该怎么做。 结果应与在Photoshop中应用索引颜色相同。
我的目标是要具有较低的色深(32色或更低)。 也许这是我的错,但我没有找到解决方法。 令人惊讶的是,没有CoreImage过滤器。
给你一个提示。
好的,我了解到该过程称为量化(或类似的:-)。 我在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.