Utilisation de l'API C pour ImageMagick (sur iPhone?) Pour convertir en monochrome?

J'utilise le code référencé dans ce post , mais je voudrais passer à une solution ImageMagick C-API, car je veux standardiser sur une seule bibliothèque de manipulation d'image, et j'ai besoin de messagerie instantanée pour d'autres tâches.

Je peux find des tonnes d'exemples d'utilisation de l'outil de command line convert, mais aucun sur la façon de faire la conversion monochrome dans le code.

Tout exemple de code là-bas?

Vous pouvez réaliser une conversion monochrome, comme décrit ici , avec la fonction MagickQuantizeImage . Je ne suis pas familier avec les images tramées, mais un exemple peut ressembler à ceci.

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

Cela peut vous donner une image plutôt tachetée parfois.

Monochrome avec dither

L'ajustement de la profondeur, du nombre de colors et / ou de la désactivation du dithering peut vous donner des résultats plus proches de ce que vous attendez des exemples fournis.

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

Comme tel … Monochrome sans tramage

Pour iOS

Pas beaucoup d'effort est nécessaire pour porter l'exemple de code à iOS. Les methods NextStep / Objective-c sont compatibles avec la bibliothèque MagickWand. L'exemple suivant utilise un file temporaire pour stocker l'image monochrome, mais je suis certain qu'il existe un meilleur moyen de transmettre directement datatables d'image Magick à l'object 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:(NSSsortingng *)filePath { // Create temporary file NSSsortingng *tempFilePath = [NSTemporaryDirectory() ssortingngByAppendingPathComponent:@"logo.jpg"]; // Read given image with C-ssortingng MagickReadImage(self.wand, [filePath cSsortingngUsingEncoding:NSASCIISsortingngEncoding] ); // Monochrome image MagickQuantizeImage(self.wand,2,GRAYColorspace,1,MagickFalse,MagickFalse); // Write to temporary file MagickWriteImage(self.wand, [tempFilePath cSsortingngUsingEncoding:NSASCIISsortingngEncoding] ); // 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 

Simulateur iOS