Skip to content

Instantly share code, notes, and snippets.

@Nyx0uf
Last active November 15, 2020 22:31
Show Gist options
  • Select an option

  • Save Nyx0uf/217d97f81f4889f4445a to your computer and use it in GitHub Desktop.

Select an option

Save Nyx0uf/217d97f81f4889f4445a to your computer and use it in GitHub Desktop.

Revisions

  1. Nyx0uf revised this gist Sep 16, 2014. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion gistfile1.m
    Original file line number Diff line number Diff line change
    @@ -52,5 +52,5 @@ -(UIImage*)mmg_imageScaledToFitSize:(CGSize)fitSize
    // Free up the remaining memory
    CGImageRelease(destRef);

    return destImage;
    return destImage;
    }
  2. Nyx0uf created this gist Sep 16, 2014.
    56 changes: 56 additions & 0 deletions gistfile1.m
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,56 @@
    -(UIImage*)mmg_imageScaledToFitSize:(CGSize)fitSize
    {
    // Create a vImage_Buffer from the CGImage
    CGImageRef sourceRef = self.CGImage;
    vImage_Buffer srcBuffer;
    vImage_CGImageFormat format = {
    .bitsPerComponent = 8,
    .bitsPerPixel = 32,
    .colorSpace = NULL,
    .bitmapInfo = (CGBitmapInfo)kCGImageAlphaFirst,
    .version = 0,
    .decode = NULL,
    .renderingIntent = kCGRenderingIntentDefault,
    };
    vImage_Error ret = vImageBuffer_InitWithCGImage(&srcBuffer, &format, NULL, sourceRef, kvImageNoFlags);
    if (ret != kvImageNoError)
    {
    free(srcBuffer.data);
    return nil;
    }

    // Create dest buffer
    const NSUInteger scale = (NSUInteger)[[UIScreen mainScreen] scale];
    const NSUInteger dstWidth = (NSUInteger)fitSize.width * scale;
    const NSUInteger dstHeight = (NSUInteger)fitSize.height * scale;
    const NSUInteger bytesPerPixel = 4;
    const NSUInteger dstBytesPerRow = bytesPerPixel * dstWidth;
    uint8_t* dstData = (uint8_t*)calloc(dstHeight * dstWidth * bytesPerPixel, sizeof(uint8_t));
    vImage_Buffer dstBuffer = {
    .data = dstData,
    .height = dstHeight,
    .width = dstWidth,
    .rowBytes = dstBytesPerRow
    };

    // Scale
    ret = vImageScale_ARGB8888(&srcBuffer, &dstBuffer, NULL, kvImageHighQualityResampling);
    free(srcBuffer.data);
    if (ret != kvImageNoError)
    {
    free(dstData);
    return nil;
    }

    // Create CGImage from vImage_Buffer
    ret = kvImageNoError;
    CGImageRef destRef = vImageCreateCGImageFromBuffer(&dstBuffer, &format, NULL, NULL, kvImageNoFlags, &ret);
    free(dstData);

    // Create UIImage
    UIImage* destImage = [[UIImage alloc] initWithCGImage:destRef scale:0.0 orientation:self.imageOrientation];
    // Free up the remaining memory
    CGImageRelease(destRef);

    return destImage;
    }