Page 1 of 1

ConvertImageCommand() and Objective-C.

Posted: 2011-09-21T15:59:18-07:00
by fulvio
I have the following code, which is simply meant to resize an image using:

Code: Select all

ConvertImageCommand()
However, with the lack of documentation in Objective-C I'm not quite sure whether I'm implemented it correctly at all.

This is what I have so far (it is simply the IM_Test.zip Xcode project) from here:

http://www.cloudgoessocial.net/im_iphone/IM_Test.zip
http://www.cloudgoessocial.net/2009/07/ ... one-xcode/

Here is my code (which sits in IM_TestViewController.m):

Code: Select all

- (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];
}
I'm not sure whether I'm using ImageInfo and ExceptionInfo properly considering I'm using MagickWand (do I even need this?).

Also the parameters I'm passing to ConvertImageCommand(), I'm not sure whether they are correct.

Any help would be greatly appreciated and thanks in advance.

Re: ConvertImageCommand() and Objective-C.

Posted: 2011-09-28T13:33:29-07:00
by el_supremo
ConvertImageCommand is a MagickCore function and there doesn't appear to be an interface to it in MagickWand (would be nice if there is one).
If all you are ever going to do in this function is a fixed resize, you could do it all with MagickWand functions and avoid MagickCore and ConvertImageCommand altogether.
I can't test this code so you'll probably have to play with it a bit.
I have assumed that input_image and output_image are filenames. If not, this won't work at all.

Pete

Code: Select all

- (void)convertImage {
	MagickWandGenesis();
	magick_wand = NewMagickWand();
	
	// 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]);
	
	if(MagickReadImage(magick_wand,input_image) == MagickFalse) {
		//>>> Report an error reading the input file
	}
	//>>> If "LanczosFilter" isn't known, use 22 instead. That's not
	//>>> the best way around it but it'll do for now.
	MagickResizeImage(magick_wand,100,100,LanczosFilter,1);
	// If this function only needs to display the result and the output file isn't actually required
	// you can omit this next statement
	MagickWriteImage(magick_wand,output_image);
	
	// Just to be sure that the blob is the correct format
	MagickSetImageFormat(magick_wand,"png");
	
	free(input_image);
	free(output_image);
	
	size_t my_size;
	unsigned char * my_image = MagickGetImageBlob(magick_wand, &my_size);
	NSData * data = [[NSData alloc] initWithBytes:my_image length:my_size];
	
	//>>> !!!! I'm not sure free(my_image) will work. "my_image" is allocated by MagickWand
	//>>> and usually you have to use its function to release the memory (but they
	//>>> may do the same thing)
	//>>> free(my_image);
	RelinquishMagickMemory(my_image);
	magick_wand = DestroyMagickWand(magick_wand);
	MagickWandTerminus();
	
	UIImage * image = [[UIImage alloc] initWithData:data];
	[data release];
	
	[imageViewButton setImage:image forState:UIControlStateNormal];
	[image release];
}

Re: ConvertImageCommand() and Objective-C.

Posted: 2011-12-04T00:12:29-07:00
by jgalyan
Check out MagickCommandGenesis().