zoukankan      html  css  js  c++  java
  • 压缩UIImage

    http://www.iphonedevsdk.com/forum/iphone-sdk-development/10527-how-resize-image.html


    I use several techniques depending on the situation. For most i resize the image to 640/480 which reduces the file size (and ultimately the transfer size) down with the code below. You could change the h/w to whatever you like. If you want to compress the image instead of resizing it give UIImageJPEGRepresentation a shot passing it a compression ratio value.

    Hope that helps

    Code:
    +(UIImage*)compressImageDownToPhoneScreenSize:(UIImage*)theImage{

    UIImage * bigImage = theImage;

    float actualHeight = bigImage.size.height;
    float actualWidth = bigImage.size.width;

    float imgRatio = actualWidth / actualHeight;
    float maxRatio = 480.0 / 640;

    if( imgRatio != maxRatio ){
    if(imgRatio < maxRatio){
    imgRatio = 480.0 / actualHeight;
    actualWidth = imgRatio * actualWidth;
    actualHeight = 480.0;

    } else {
    imgRatio = 320.0 / actualWidth;
    actualHeight = imgRatio * actualHeight; 
    actualWidth = 320.0;
    }

    }


    CGRect rect = CGRectMake(0.0, 0.0, actualWidth, actualHeight);
    UIGraphicsBeginImageContext(rect.size);
    [bigImage drawInRect:rect]; // scales image to rect
    theImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    //RETURN
    return theImage;

    }


    --------------


    I also used Boston Merlin code, but it seems the final image is encoded in some weird order of ARGB.. something like ABGR or other. So, I modified it a bit to make it return a ARGB.

    Code:
    -(UIImage*)compressImageDownToPhoneScreenSize:(UIImage*)theImage{

    UIImage * bigImage = theImage;



    CGImageRef inImage = bigImage.CGImage;
    // Create off screen bitmap context to draw the image into. Format ARGB is 4 bytes for each pixel: Alpa, Red, Green, Blue
    CGContextRef cgctx = [self createARGBBitmapContextFromImage:inImage];
    if (cgctx == NULL) { /* error */ }

    size_t w = CGImageGetWidth(inImage);
    size_t h = CGImageGetHeight(inImage);


    float imgRatio = w / h;
    float maxRatio = 640.0 / 480;

    if( imgRatio != maxRatio ){
    if(imgRatio < maxRatio){
    imgRatio = 640.0 / h;
    w = imgRatio * w;
    h = 640.0;

    } else {
    imgRatio = 480.0 / w;
    h = imgRatio * h; 
    w = 480.0;
    }

    }


    CGRect rect = {{0,0},{w,h}}; 

    // Draw the image to the bitmap context. Once we draw, the memory
    // allocated for the context for rendering will then contain the
    // raw image data in the specified color space.
    CGContextDrawImage(cgctx, rect, inImage); 


    CGImageRef imageRef = CGBitmapContextCreateImage (cgctx); 
    UIImage* rawImage = [UIImage imageWithCGImage:imageRef]; 

    //RETURN
    return rawImage;

    // When finished, release the context
    CGContextRelease(cgctx);
    // Free image data memory for the context



    }
    You also need this function (available in Apple doc as well, just cut and paste)
    Code:
    -(CGContextRef)createARGBBitmapContextFromImage:(CGImageRef)inImage {

    CGContextRef context = NULL;
    CGColorSpaceRef colorSpace;
    void * bitmapData;
    int bitmapByteCount;
    int bitmapBytesPerRow;

    // Get image width, height. We'll use the entire image.
    size_t pixelsWide = CGImageGetWidth(inImage);
    size_t pixelsHigh = CGImageGetHeight(inImage);

    // Declare the number of bytes per row. Each pixel in the bitmap in this
    // example is represented by 4 bytes; 8 bits each of red, green, blue, and
    // alpha.
    bitmapBytesPerRow = (pixelsWide * 4);
    bitmapByteCount = (bitmapBytesPerRow * pixelsHigh);

    // Use the generic RGB color space.
    colorSpace = CGColorSpaceCreateDeviceRGB(); 

    if (colorSpace == NULL)
    {
    fprintf(stderr, "Error allocating color space\n");
    return NULL;
    }

    // Allocate memory for image data. This is the destination in memory
    // where any drawing to the bitmap context will be rendered.
    bitmapData = malloc( bitmapByteCount );
    if (bitmapData == NULL)
    {
    fprintf (stderr, "Memory not allocated!");
    CGColorSpaceRelease( colorSpace );
    return NULL;
    }

    // Create the bitmap context. We want pre-multiplied ARGB, 8-bits
    // per component. Regardless of what the source image format is
    // (CMYK, Grayscale, and so on) it will be converted over to the format
    // specified here by CGBitmapContextCreate.
    context = CGBitmapContextCreate (bitmapData,
    pixelsWide,
    pixelsHigh,
    8, // bits per component
    bitmapBytesPerRow,
    colorSpace,
    kCGImageAlphaPremultipliedFirst);
    if (context == NULL)
    {
    free (bitmapData);
    fprintf (stderr, "Context not created!");
    }

    // Make sure and release colorspace before returning
    CGColorSpaceRelease( colorSpace );

    return context;
    }

    come from http://sue602.blog.163.com/blog/static/314953072010323112018803/ 

  • 相关阅读:
    Task 和 Function
    FPGA中双向端口的设计原理及仿真
    EDK实用实例之LED
    分频电路设计(笔记)
    你了解Promise么
    配置vue多页
    Chrome控制台console的那些属性
    关于读书
    django常用命令
    django 简易博客开发 2 模板和数据查询
  • 原文地址:https://www.cnblogs.com/likwo/p/2796899.html
Copyright © 2011-2022 走看看