使用ImageMagick的C API(在iPhone?上)转换为单色? [英] Using the C API for ImageMagick (on iPhone?) to convert to monochrome?

查看:190
本文介绍了使用ImageMagick的C API(在iPhone?上)转换为单色?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用这篇文章中引用的代码,但是我想切换到基于ImageMagick C-API的解决方案,因为我想在单个图像处理库上进行标准化,并且需要IM来完成其他任务。

I am using the code referenced in this post, but would like to switch to an ImageMagick C-API based solution, as I want to standardize on a single image manipulation library, and need IM for some other tasks.

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

I can find tons of examples of using the convert command line tool, but none on how to do the monochrome conversion in code.

那里有任何示例代码?

推荐答案

您可以实现单色转换,如这里 MagickQuantizeImage 功能。
我不太熟悉抖动图像,但示例可能如下所示。

You can achieve monochrome conversion, as described here, with MagickQuantizeImage function. I'm not quite familiar with dithering images, but an example may look like the following.

#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;
}

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

This can give you a rather speckled image at times.

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

Adjusting depth, color-number, and/or disabling dithering may give you results closer to what you would expect from the examples provided.

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

像这样...

Like such...

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

Not much effort is needed to port the example code to iOS. NextStep/Objective-c methods are compatible with MagickWand library. The following example uses a temporary file to store the monochrome image, but I'm sure there is a better way to pass Magick image-data directly to UImage object.

// 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

这篇关于使用ImageMagick的C API(在iPhone?上)转换为单色?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆