software-mariodiana
12/10/2019 - 9:19 PM

Resizing an image with ImageMagick library for iOS.

#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;
}