1

我决定使用以下 ImageMagick 库进行 iPhone 开发:

https://github.com/marforic/imagemagick_lib_iphone

它工作得很好。示例项目编译得很好,但没有任何意义。

通常,我会使用ImageMagick for Windows 附带的“ convert.exe ”通过命令行转换图像。所以我会写一个像下面这样的小批处理文件:

@echo off

set SOURCE=image_to_convert.jpg

del result.jpg
del source_copy.jpg

convert.exe %SOURCE% -fill "#fff8f2" -colorize 100%% fill.jpg

copy %SOURCE% source_copy.jpg

convert.exe %SOURCE% -modulate 100,0,100 -|^
convert.exe - source_copy.jpg -compose overlay -composite -|^
convert.exe source_copy.jpg - -compose dissolve -define compose:args=37,100 -composite -|^
convert.exe - -modulate 100,70,100 +level 3.5%%,100%% -|^
convert.exe - -channel red -level 0%%,89%% +level 9%%,100%% -|^
convert.exe - -channel green +level 3.5%%,100%% -|^
convert.exe - -channel blue -level 0%%,93%% +level 4.7%%,100%% -|^
convert.exe - -brightness-contrast -5x3 -|^
convert.exe fill.jpg - -compose multiply -gravity center -composite -|^
convert.exe - -level 3.5%%,100%%,0.91 +level 2.7%%,100%% -|^
convert.exe - -channel red +level 3.5%%,100%% -|^
convert.exe - -channel green -level 0%%,87%% +level 1%%,100%% -|^
convert.exe - -channel blue -level 0%%,100%%,0.94 +level 7%%,100%% -|^
convert.exe - -brightness-contrast -1x0 final_converted_image.jpg

del source_copy.jpg
del fill.jpg

问题是将上述批处理文件转换为与该特定库一起使用。

- (void)convertImage {
    MagickWandGenesis();
    magick_wand = NewMagickWand();
    //UIImageJPEGRepresentation([imageViewButton imageForState:UIControlStateNormal], 90);
    NSData * dataObject = UIImagePNGRepresentation([UIImage imageNamed:@"iphone.png"]);
    MagickBooleanType status;
    status = MagickReadImageBlob(magick_wand, [dataObject bytes], [dataObject length]);
    if (status == MagickFalse) {
        ThrowWandException(magick_wand);
    }

    // Resize image.
    ImageInfo *imageInfo = AcquireImageInfo();
    ExceptionInfo *exceptionInfo = AcquireExceptionInfo();

    // Get image from bundle.
    char *input_image = strdup([[[NSBundle mainBundle] pathForResource:@"iphone" ofType:@"png"] UTF8String]);
    char *output_image = strdup([[[NSBundle mainBundle] pathForResource:@"iphone" ofType:@"png"] UTF8String]);
    char *argv[] = { "convert", input_image, "-resize", "100x100", output_image, NULL };

    // ConvertImageCommand(ImageInfo *, int, char **, char **, MagickExceptionInfo *);
    status = ConvertImageCommand(imageInfo, 5, argv, NULL, exceptionInfo);

    free(input_image);
    free(output_image);

    if (status == MagickFalse) {
        ThrowWandException(magick_wand); // Always throws an exception here...
    }

    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 * image = [[UIImage alloc] initWithData:data];
    [data release];

    [imageViewButton setImage:image forState:UIControlStateNormal];
    [image release];
}

问题是status始终是MagickFalse,这意味着它会引发异常。我也不确定我是否ConvertImageCommand()以正确的方式使用。

任何帮助将不胜感激。提前致谢。

4

2 回答 2

1

我最终使用MagickCommandGenesis()来达到预期的结果。

于 2012-01-04T01:00:46.607 回答
0

这些都不是正确的答案。上面的代码完全是错误的,并且已经以某种形式在整个互联网上复制和粘贴

http://www.imagemagick.org/discourse-server/viewtopic.php?t=19504 http://www.imagemagick.org/discourse-server/viewtopic.php?t=25430 iPhone ImageMagick 库 - 从批处理文件转换使用 MagickWand API 到 Objective-C 的脚本 http://www.imagemagick.org/discourse-server/viewtopic.php?f=6&t=20527

名单还在继续

MagicWand是使用 imagemagick API 进行图像操作的框架,而ConvertImageCommand直接调用命令的命令行界面convert。如果你想通过 imagemagick 的 api 做事,那么使用 MagicWand 等,但如果你想简单地调用从命令行使用的相同方法,那么调用ConvertImageCommand.

它返回的事实MagickFalse是正确的。虽然我没有声称已经阅读了整个方法并且知道它所做的一切或为什么,但如果你查看convert.c http://www.imagemagick.org/api/MagickWand/convert_8c_source.html,函数的最后几行是

3217   status&=WriteImages(image_info,image,argv[argc-1],exception);
 3218   if (metadata != (char **) NULL)
 3219     {
 3220       char
 3221         *text;
 3222 
 3223       text=InterpretImageProperties(image_info,image,format);
 3224       if (text == (char *) NULL)
 3225         ThrowConvertException(ResourceLimitError,"MemoryAllocationFailed",
 3226           GetExceptionMessage(errno));
 3227       (void) ConcatenateString(&(*metadata),text);
 3228       text=DestroyString(text);
 3229     }
 3230   DestroyConvert();
 3231   return(status != 0 ? MagickTrue : MagickFalse);
 3232 }

MagickFalse它所说的是从命令行调用成功时返回 0 ( ),这是相当合理的。

如果没有所有 MagicWand 的东西,上面的代码也可以正常工作 -

// Resize image.
    ImageInfo *imageInfo = AcquireImageInfo();
    ExceptionInfo *exceptionInfo = AcquireExceptionInfo();

    // Get image from bundle.
    char *input_image = strdup([[[NSBundle mainBundle] pathForResource:@"iphone" ofType:@"png"] UTF8String]);
    char *output_image = strdup([[[NSBundle mainBundle] pathForResource:@"iphone" ofType:@"png"] UTF8String]);
    char *argv[] = { "convert", input_image, "-resize", "100x100", output_image, NULL };

    // ConvertImageCommand(ImageInfo *, int, char **, char **, MagickExceptionInfo *);
    status = ConvertImageCommand(imageInfo, 5, argv, NULL, exceptionInfo);

或者,如果您想直接使用 API,那么网上有大量示例提供了如何使用 MagicWand 的示例。

上面的代码试图混合和匹配两种不同的方法。上面的 MagicWand 实例没有做任何事情,如果您查看NSData上面代码片段末尾的图像,它与您开始使用的图像相同。的输出ConvertImageCommand应该是你所期望的。

于 2015-05-21T03:42:04.453 回答