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;
}
}
我需要降低 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;
}
}