#import "MagickWand.h"
- (UIImage *)resizeImage:(UIImage *)image
width:(CGFloat)width
height:(CGFloat)height
{
MagickWandGenesis();
MagickWand* wand = NewMagickWand();
NSData* data = UIImagePNGRepresentation(image);
BOOL success = MagickReadImageBlob(wand, [data bytes], [data length]);
if (!success) {
NSLog(@"Error reading input image: %@", image);
return nil;
}
// We're used to CGFloat, but the library uses size_t (integers).
MagickResizeImage(wand, llroundf(width), llroundf(height), LanczosFilter, 1.0);
const char* map = "ARGB";
NSInteger w = MagickGetImageWidth(wand);
NSInteger h = MagickGetImageHeight(wand);
NSInteger size = strlen(map) * w * h * sizeof(char);
void* buffer = (void *)malloc(size);
MagickExportImagePixels(wand, 0, 0, w, h, map, CharPixel, buffer);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef contextRef = CGBitmapContextCreate(buffer,
w,
h,
8,
w * strlen(map),
colorSpace,
kCGImageAlphaPremultipliedFirst);
CGImageRef cgImage = CGBitmapContextCreateImage(contextRef);
UIImage *resizedImage = [[UIImage alloc] initWithCGImage:cgImage];
CGImageRelease(cgImage);
CGContextRelease(contextRef);
CGColorSpaceRelease(colorSpace);
free(buffer);
DestroyMagickWand(wand);
MagickWandTerminus();
return resizedImage;
}