我需要降低UIImage的颜色深度,但我无法弄清楚如何去做。结果应与在Photoshop中应用索引颜色相同。
我的目标是颜色深度较低(32色或更低)。也许这是我的错,但我找不到办法去做。令人惊讶的是,没有CoreImage过滤器。
给你一个提示。
好的,我了解到这个过程叫做量化(或类似的:-))。我找到了非常好的源代码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;
}
}
答案 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;
}
}