Библиотека iPhone ImageMagick - преобразование из сценария пакетного файла в Objective-C с использованием MagickWand API - PullRequest
1 голос
/ 20 сентября 2011

Я решил использовать следующую библиотеку ImageMagick для разработки на iPhone:

https://github.com/marforic/imagemagick_lib_iphone

Работает довольно хорошо. Пример проекта компилируется просто отлично, но не имеет никакого смысла.

Обычно я использую " convert.exe ", который поставляется с ImageMagick для Windows, для преобразования изображений через командную строку. Поэтому я напишу небольшой командный файл, подобный следующему:

@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().

Любая помощь будет принята с благодарностью. Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 04 октября 2012

Вы можете найти использование imagemagick здесь

эта ссылка была очень полезна для меня.

1 голос
/ 04 января 2012

Я использовал MagickCommandGenesis() для достижения желаемого результата.

0 голосов
/ 21 мая 2015

Ни один из них не является правильным ответом.Приведенный выше код просто неверен и был скопирован и вставлен по всему Интернету в той или иной форме

http://www.imagemagick.org/discourse-server/viewtopic.php?t=19504 http://www.imagemagick.org/discourse-server/viewtopic.php?t=25430 Библиотека iPhone ImageMagick - преобразование из пакетафайл сценария для Objective-C с использованием MagickWand API http://www.imagemagick.org/discourse-server/viewtopic.php?f=6&t=20527

список можно продолжить

MagicWand - это структура для работы с изображениями с использованием API imagemagick, тогда как ConvertImageCommandвызывает непосредственно в интерфейс командной строки для команды convert.Если вы хотите сделать что-то через API ImageMagick, затем использовать 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 }

Что он говорит, так это возвращает 0 (MagickFalse) в случае успеха при вызове из командной строки, что вполне разумно.

Приведенный выше код будет хорошо работать без всех вещей 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 должен быть тем, что вы ожидаете.

...