UIImage 圖片處理:截圖雌团,縮放燃领,設(shè)定大小,存儲

圖片的處理大概分 截圖(capture), ?縮放(scale), 設(shè)定大小(resize), ?存儲(save)

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的文件里和儲存到手機(jī)的圖片庫里

1)?儲存到app的文件里

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

[UIImagePNGRepresentation(image) writeToFile:pathatomically:YES];

把要處理的圖片, 以image.png名稱存到app home下的Documents目錄里

2)儲存到手機(jī)的圖片庫里(必須在真機(jī)使用锦援,模擬器無法使用)

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封裝了變換的參數(shù)灵寺,使得在不同的坐標(biāo)系里操作圖像非常方便曼库。缺點就是,獲取圖像的數(shù)據(jù)不是那么方便略板。下面會給出獲取數(shù)據(jù)區(qū)的代碼毁枯。

1. 從UIView中獲取圖像相當(dāng)于窗口截屏。

(ios提供全局的全屏截屏函數(shù)UIGetScreenView(). 如果需要特定區(qū)域的圖像蚯根,可以crop一下)

CGImageRef screen = UIGetScreenImage();

UIImage* image = [UIImage imageWithCGImage:screen];

2. 對于特定UIView的截屏后众。

(可以把當(dāng)前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;

}

3. 如果需要裁剪指定區(qū)域。

(可以path & clip教藻,以下例子是建一個200x200的圖像上下文距帅,再截取出左上角)

UIGraphicsBeginImageContext(CGMakeSize(200,200));

CGContextRefcontext=UIGraphicsGetCurrentContext();

UIGraphicsPushContext(context);

// ...把圖寫到context中,省略[indent]CGContextBeginPath();

CGContextAddRect(CGMakeRect(0,0,100,100));

CGContextClosePath();[/indent]CGContextDrawPath();

CGContextFlush();// 強(qiáng)制執(zhí)行上面定義的操作

UIImage* image = UIGraphicGetImageFromCurrentImageContext();

UIGraphicsPopContext();

4. 存儲圖像括堤。

(分別存儲到home目錄文件和圖片庫文件碌秸。)

存儲到目錄文件是這樣

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

[UIImagePNGRepresentation(image) writeToFile:path atomically:YES];

若要存儲到圖片庫里面

UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);

5.互相轉(zhuǎn)換UImage和CGImage绍移。

(UImage封裝了CGImage, 互相轉(zhuǎn)換很容易)

UIImage* imUI=nil;

CGImageRef imCG=nil;

imUI = [UIImage initWithCGImage:imCG];

imCG = imUI.CGImage;

6. 從CGImage上獲取圖像數(shù)據(jù)區(qū)。

(在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;

}

7.顯示圖像數(shù)據(jù)區(qū)讥电。

(顯示圖像數(shù)據(jù)區(qū)蹂窖,也就是unsigned char*轉(zhuǎn)為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);

得到圖像數(shù)據(jù)區(qū)后就可以很方便的實現(xiàn)圖像處理的算法。

轉(zhuǎn)自別處恩敌,用于自己筆記之用瞬测。侵刪

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市纠炮,隨后出現(xiàn)的幾起案子月趟,更是在濱河造成了極大的恐慌,老刑警劉巖恢口,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件孝宗,死亡現(xiàn)場離奇詭異,居然都是意外死亡耕肩,警方通過查閱死者的電腦和手機(jī)因妇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來猿诸,“玉大人婚被,你說我怎么就攤上這事×椒迹” “怎么了摔寨?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長怖辆。 經(jīng)常有香客問我是复,道長,這世上最難降的妖魔是什么竖螃? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任淑廊,我火速辦了婚禮,結(jié)果婚禮上特咆,老公的妹妹穿的比我還像新娘季惩。我一直安慰自己,他們只是感情好腻格,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布画拾。 她就那樣靜靜地躺著,像睡著了一般菜职。 火紅的嫁衣襯著肌膚如雪青抛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天酬核,我揣著相機(jī)與錄音蜜另,去河邊找鬼适室。 笑死,一個胖子當(dāng)著我的面吹牛举瑰,可吹牛的內(nèi)容都是我干的捣辆。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼此迅,長吁一口氣:“原來是場噩夢啊……” “哼汽畴!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起邮屁,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤整袁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后佑吝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坐昙,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年芋忿,在試婚紗的時候發(fā)現(xiàn)自己被綠了炸客。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡戈钢,死狀恐怖痹仙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情殉了,我是刑警寧澤开仰,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站薪铜,受9級特大地震影響众弓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜隔箍,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一谓娃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蜒滩,春花似錦滨达、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至竹握,卻和暖如春稽莉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背涩搓。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工污秆, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人昧甘。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓良拼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親充边。 傳聞我的和親對象是個殘疾皇子庸推,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容