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);
 
时间: 2024-08-23 03:06:24

UIImage 相关操作的相关文章

ios下UIImage相关开发经验总结

iOS下做和UIImage相关功能有段时间,这里总结列下相关经验. 1. 基本框架image IO image IO可以通过URL或者data Provider来生成CGImageSourceRef,然后可以在source上获取第几张图片或者缩略图:根据http://www.mindsea.com/2012/12/downscaling-huge-alassets-without-fear-of-sigkill/文中所讲,使用这种方式比直接加载fullsolutionimage,然后利用core

二叉树的相关操作

#include<stdio.h> #include<malloc.h> #define MAXSIZE 20 typedef char TEelemtype; typedef struct BiTNode{ TEelemtype data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; //队列的方式 typedef struct queueelem { BiTNode* b[MAXSIZE]; int front,rear;

(二十四)linux新定时器:timefd及相关操作函数

timerfd是Linux为用户程序提供的一个定时器接口.这个接口基于文件描述符,通过文件描述符的可读事件进行超时通知,所以能够被用于select/poll的应用场景. 一,相关操作函数 #include <sys/timerfd.h> int timerfd_create(int clockid, int flags); int timerfd_settime(int fd, int flags, const struct itimerspec *new_value, struct itim

二叉树各种相关操作(建立二叉树、前序、中序、后序、求二叉树的深度、查找二叉树节点,层次遍历二叉树等)(C语言版)

将二叉树相关的操作集中在一个实例里,有助于理解有关二叉树的相关操作: 1.定义树的结构体: 1 typedef struct TreeNode{ 2 int data; 3 struct TreeNode *left; 4 struct TreeNode *right; 5 }TreeNode; 2.创建根节点: 1 TreeNode *creatRoot(){ 2 TreeNode * root =(TreeNode *)malloc(sizeof(TreeNode)); 3 if(NULL=

linux下进程相关操作

一.定义和理解 狭义定义:进程是正在运行的程序的实例. 广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动. 进程的概念主要有两点: 第一,进程是一个实体.每一个进程都有它自己的地址空间,一般情况下,包括文本区域.数据区域和堆栈区域.文本区域存储处理器执行的代码:数据区域存储变量和进程执行期间使用的动态分配的内存:堆栈区域存储着活动过程调用的指令和本地变量. 第二,进程是一个“执行中的程序”.程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体,我们

android DataBase的相关操作(建立表结构和创建表)

先建立一个table的基类: public abstract class DbBaseTable { private static final String TAG = "DbBaseTable"; /** * @return the DB table name */ abstract String getName(); /** * Creates the DB table according to the DB scheme * * @param db */ abstract voi

WebView中的视频全屏的相关操作

最近工作中,基本一直在用WebView,今天就把它整理下: WebView 顾名思义,就是放一个网页,一个看起来十分简单,但是用起来不是那么简单的控件. 首先你肯定要定义,初始化一个webview,其实网上的例子很多,我这里就简单的把一些WebView 中可能会用到的的很重要的属性以及支持全屏播放视频该怎么实现的代码粘出来,直接放到项目中去就行了 <span style="white-space:pre"></span><pre name="co

jQuery学习笔记--JqGrid相关操作 方法列表(上)

1.获得当前列表行数:$("#gridid").getGridParam("reccount"); 2.获取选中行数据(json):$("#gridid").jqGrid('getRowData', id); 3.刷新列表:$(refreshSelector).jqGrid('setGridParam', { url: ''), postData: ''}).trigger('reloadGrid'); 4.选中行:$("#jqGrid

JQuery select控件的相关操作

本文转载于 http://www.cnblogs.com/zfc2201/archive/2012/09/06/2674312.html JQuery获取和设置Select选项方法汇总如下: 获取select 先看看下面代码: $("#select_id").change(function(){//code...}); //为Select添加事件,当选择其中一项时触发 var checkText=$("#select_id").find("option:s