zoukankan      html  css  js  c++  java
  • UIImage 相关操作

     

    修改UIImage大小

    修改UISlider的最大值和最小值图片的时候,发现需要修改图片的大小,否则会导致UISlider变形。目前苹果还不支持直接修改UIImage类的大小,只能修改UIImageView的大小。

    所以只能通过写方法的方式来实现修改图片。如下:

     //UIImage.h
    
    #import <Foundation/Foundation.h>
    
    @interface UIImage (Scale)
    
    -(UIImage *)TransformtoSize:(CGSize)Newsize;
    
    @end
    
    //UIImage.m
    
     
    
    #import "UIImage.h"
    
    @implementation UIImage (Scale)
    
    -(UIImage *)TransformtoSize:(CGSize)Newsize
    
    {
    
        // 创建一个bitmap的context
    
        UIGraphicsBeginImageContext(Newsize);
    
        // 绘制改变大小的图片
    
        [self drawInRect:CGRectMake(0, 0, Newsize.width, Newsize.height)];
    
        // 从当前context中创建一个改变大小后的图片
    
        UIImage *TransformedImg=UIGraphicsGetImageFromCurrentImageContext();
    
        // 使当前的context出堆栈
    
        UIGraphicsEndImageContext();
    
        // 返回新的改变大小后的图片
    
        return TransformedImg;
    
    }
    
    @end
    
    最后在其他地方导入头文件,即可以使用此方法了。
    
     
    
    UIImage *MaxImg=[UIImage imageNamed:@"sunny.png"];
    
    UIImage *MaxImg_Fin=[MaxImg TransformtoSize:CGSizeMake(28, 28)];

    调整UIImage尺寸适应UIImageView

    + (UIImage*)imageWithImage:(UIImage*)image 
                   scaledToSize:(CGSize)newSize;
    {
       UIGraphicsBeginImageContext( newSize );
       [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
       UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
       UIGraphicsEndImageContext();
    
       return newImage;
    }

    指定新尺寸(768,1024) 然后传递初始图片,但是要保证高宽比和原始的比例一样。

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

    http://my.oschina.net/rareliu/blog/24322

    UIImage 图片处理:截图,缩放,设定大小,存储
    发表于3年前(2011-06-21 15:35)

    图片的处理大概就分 截图(capture), 缩放(scale),设定大小(resize), 存储(save)
    这几样比较好处理, 另外还有滤镜,擦试等, 以后再说
    在这个Demo code裡, 我写了几个方法


    1.等比率缩放

    - (UIImage *)scaleImage:(UIImage *)image toScale:(float)scaleSize
    {
    
    UIGraphicsBeginImageContext(CGSizeMake(image.size.width * scaleSize, image.size.height * scaleSize);
    [image drawInRect:CGRectMake(0, 0, image.size.width * scaleSize, image.size.height * scaleSize)];
    UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    
    return scaledImage;
    
    }




    2.自定长宽

    - (UIImage *)reSizeImage:(UIImage *)image toSize:(CGSize)reSize
    {
    UIGraphicsBeginImageContext(CGSizeMake(reSize.width, reSize.height));
    [image drawInRect:CGRectMake(0, 0, reSize.width, reSize.height)];
    UIImage *reSizeImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    
    return reSizeImage;
    
    }




    3.处理某个特定View
    只要是继承UIView的object 都可以处理
    必须先import QuzrtzCore.framework

    -(UIImage*)captureView:(UIView *)theView
    {
    CGRect rect = theView.frame;
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    [theView.layer renderInContext:context];
    UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    
    return img;
    
    }



    4.储存图片
    储存图片这里分成储存到app的文件里, 储存到手机的图片库里

    1) 储存到app的文件里

    NSString *path = [[NSHomeDirectory()stringByAppendingPathComponent:@"Documents"]stringByAppendingPathComponent:@"image.png"];
    [UIImagePNGRepresentation(image) writeToFile:pathatomically:YES];


    這樣就把你要處理的圖片, 以image.png這個檔名存到app home底下的Documents目錄裡

    2)储存到手机的图片库里

    CGImageRef screen = UIGetScreenImage();
    UIImage* image = [UIImage imageWithCGImage:screen];
    CGImageRelease(screen);
    UIImageWriteToSavedPhotosAlbum(image, self, nil, nil);

    UIGetScreenImage()原本是private(私有)api, 用來截取整個畫麵不過SDK 4.0後apple就開放了

    另外儲存到手機的圖片庫裡, 必須在實機使用, 模擬器無法使用


    以下代碼用到了Quartz Framework和Core Graphics Framework. 在workspace的framework目錄裏添加這兩個framework.在UIKit裏,圖像類UIImage和CGImageRef的畫圖操作都是通過Graphics Context來完成。Graphics Context封裝了變換的參數,使得在不同的坐標係裏操作圖像非常方便。缺點就是,獲取圖像的數據不是那麼方便。下麵會給出獲取數據區的代碼。



    從UIView中獲取圖像相當於窗口截屏。ios提供全局的全屏截屏函數UIGetScreenView(). 如果需要特定區域的圖像,可以crop一下。

    CGImageRef screen = UIGetScreenImage();
    UIImage* image = [UIImage imageWithCGImage:screen];


    對於特定UIView的截屏,可以把當前View的layer,輸出到一個ImageContext中,然後利用這個ImageContext得到UIImage

    -(UIImage*)captureView: (UIView *)theView
    {
        CGRect rect = theView.frame;
        UIGraphicsBeginImageContext(rect.size);
        CGContextRef context =UIGraphicsGetCurrentContext();
        [theView.layer renderInContext:context];
        UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    
        return img;
    }


    如果需要裁剪製定區域,可以path & clip,以下例子是建一個200x200的圖像上下文,再截取出左上角

        UIGraphicsBeginImageContext(CGMakeSize(200,200));
        CGContextRefcontext=UIGraphicsGetCurrentContext();
        UIGraphicsPushContext(context);
        // ...把图写到context中,省略[indent]CGContextBeginPath();
        CGContextAddRect(CGMakeRect(0,0,100,100));
        CGContextClosePath();[/indent]CGContextDrawPath();
        CGContextFlush();  // 强制执行上面定义的操作
        UIImage* image = UIGraphicGetImageFromCurrentImageContext();
        UIGraphicsPopContext();



    存储图像分为存储到home目录文件和图片库文件。存储到目录文件是这样

    NSString *path = [[NSHomeDirectory()     stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:@"image.png"];
    
    [UIImagePNGRepresentation(image) writeToFile:path atomically:YES];


    若要存储到图片库里面

    UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);


    UImage封装了CGImage, 互相转换很容易

    UIImage* imUI=nil;
    CGImageRef imCG=nil;
    imUI = [UIImage initWithCGImage:imCG];
    imCG = imUI.CGImage;



    從CGImage上獲取圖像數據區,在apple dev上有QA, 不過好像還不支持ios
    下麵給出一個在ios上反色的例子

        -(id)invertContrast:(UIImage*)img
        {
        CGImageRef inImage = img.CGImage;
        CGContextRef ctx;
        CFDataRef m_DataRef;
        m_DataRef = CGDataProviderCopyData(CGImageGetDataProvider(inImage));
    
        int width = CGImageGetWidth( inImage );
        int height = CGImageGetHeight( inImage );
    
        int bpc = CGImageGetBitsPerComponent(inImage);
        int bpp = CGImageGetBitsPerPixel(inImage);
        int bpl = CGImageGetBytesPerRow(inImage);
    
        UInt8 * m_PixelBuf = (UInt8 *) CFDataGetBytePtr(m_DataRef);
        int length = CFDataGetLength(m_DataRef);
    
        NSLog(@"len %d", length);
        NSLog(@"width=%d, height=%d", width, height);
        NSLog(@"1=%d, 2=%d, 3=%d", bpc, bpp,bpl);
    
        for (int index = 0; index < length; index += 4)
        {
        m_PixelBuf[index + 0] = 255 - m_PixelBuf[index + 0];// b
        m_PixelBuf[index + 1] = 255 - m_PixelBuf[index + 1];// g
        m_PixelBuf[index + 2] = 255 - m_PixelBuf[index + 2];// r
        }
    
        ctx = CGBitmapContextCreate(m_PixelBuf, width, height, bpb, bpl, CGImageGetColorSpace( inImage ), kCGImageAlphaPremultipliedFirst );
        CGImageRef imageRef = CGBitmapContextCreateImage (ctx);
        UIImage* rawImage = [UIImage imageWithCGImage:imageRef];
        CGContextRelease(ctx);
        return rawImage;
        }




    得到圖像數據區後就可以很方便的實現圖像處理的算法。下麵給顯示圖像數據區的方法,也就是unsigned char*轉為graphics context或者UIImage或和CGImageRef

        CGContextRef ctx = CGBitmapContextCreate(pixelBuf,width,height, bitsPerComponent,bypesPerLine, colorSpace,kCGImageAlphaPremultipliedLast );
        CGImageRef imageRef = CGBitmapContextCreateImage (ctx);
        UIImage* image = [UIImage imageWithCGImage:imageRef];
        NSString* path = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:@"ss.png"];
        [UIImagePNGRepresentation(self.image) writeToFile:path atomically:YES];
        CGContextRelease(ctx);
     
  • 相关阅读:
    网速测速结果,单位换算
    js实现多个列表分别倒计时功能
    微信小程序使用wxs在页面中调用js函数,颜色值格式转换 rgb和十六进制的转换
    css样式列表宽度自适应布局
    投资轮次说明
    Ajax与JSON共同使用的小实例
    js结构
    关于vue的小实例
    label与input之间的对应
    购物demo
  • 原文地址:https://www.cnblogs.com/allanliu/p/4166505.html
Copyright © 2011-2022 走看看