Использование C API для ImageMagick (на iPhone?) Для преобразования в монохромный режим?
Я использую код, упомянутый в этом посте, но хотел бы перейти на решение на основе C-API ImageMagick, так как я хочу стандартизировать единую библиотеку манипуляций с изображениями и мне нужен IM для некоторых других задач.
Я могу найти множество примеров использования инструмента командной строки конвертации, но ни одного о том, как сделать монохромное преобразование в коде.
Какой-нибудь пример кода там?
1 ответ
Вы можете добиться монохромного преобразования, как описано здесь, с помощью функции 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