使用ImageMagick的C API(在iPhone上?)转换为单色?

我正在使用本文中引用的代码,但想切换到基于ImageMagick C-API的解决scheme,因为我想要在单个图像操作库上进行标准化,并且需要IM来执行其他任务。

我可以find使用convert命令行工具的大量例子,但没有关于如何在代码中进行单色转换的例子。

任何示例代码?

您可以使用MagickQuantizeImage函数实现单色转换,如此处所述。 我对抖动图像不是很熟悉,但是一个例子可能如下所示。

#include <wand/MagickWand.h> int main(int argc, char **argv) { const size_t number_colors = 2; const size_t treedepth = 1; MagickWandGenesis(); MagickWand *wand = NULL; wand = NewMagickWand(); MagickReadImage(wand,"source.png"); MagickQuantizeImage( wand, // MagickWand number_colors, // Target number colors GRAYColorspace, // Colorspace treedepth, // Optimal depth MagickTrue, // Dither MagickFalse // Quantization error ); MagickWriteImage(wand,"out.png"); if(wand)wand = DestroyMagickWand(wand); MagickWandTerminus(); return 0; } 

这有时会给你一个相当斑点的图像。

单色与抖动

调整深度,颜色编号和/或禁用抖动可能会使您的结果更接近您所期望的示例。

 MagickQuantizeImage( wand, // MagickWand number_colors, // Target number colors GRAYColorspace, // Colorspace treedepth, // Optimal depth MagickFalse, // No-dither MagickFalse // Quantization error ); 

像这样… 单色无抖动

对于iOS

将示例代码移植到iOS不需要太多的努力。 NextStep / Objective-c方法与MagickWand库兼容。 以下示例使用临时文件来存储单色图像,但是我确定有更好的方式将Magick图像数据直接传递给UImage对象。

 // MyViewController.h #import <UIKit/UIKit.h> #import <wand/MagickWand.h> @interface MyViewController : UIViewController @property (retain, nonatomic) IBOutlet UIImageView *imageView; @property (retain, nonatomic) MagickWand *wand; @end // MyViewController.m #import "MyViewController.h" @implementation MyViewController - (void)viewDidLoad { [super viewDidLoad]; MagickWandGenesis(); self.wand = NewMagickWand(); [self drawMonochromeImage:@"logo:"]; } -(void)drawMonochromeImage:(NSString *)filePath { // Create temporary file NSString *tempFilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"logo.jpg"]; // Read given image with C-string MagickReadImage(self.wand, [filePath cStringUsingEncoding:NSASCIIStringEncoding] ); // Monochrome image MagickQuantizeImage(self.wand,2,GRAYColorspace,1,MagickFalse,MagickFalse); // Write to temporary file MagickWriteImage(self.wand, [tempFilePath cStringUsingEncoding:NSASCIIStringEncoding] ); // Load UIImage from temporary file UIImage *imgObj = [UIImage imageWithContentsOfFile:tempFilePath]; // Display on device [self.imageView setImage:imgObj]; [self.imageView setContentMode:UIViewContentModeScaleAspectFit]; } -(void)viewDidUnload { // Clean-up if (self.wand) self.wand = DestroyMagickWand(self.wand); MagickWandTerminus(); } @end 

iOS模拟器