UIImage 圖片處理:截圖,縮放,設(shè)定大小,存儲(chǔ)

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.自定長(zhǎng)寬

  • (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.處理某個(gè)特定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.儲(chǔ)存圖片
儲(chǔ)存圖片這里分成儲(chǔ)存到app的文件里和儲(chǔ)存到手機(jī)的圖片庫(kù)里

  1. 儲(chǔ)存到app的文件里
    NSString *path = [[NSHomeDirectory()stringByAppendingPathComponent:@"Documents"]stringByAppendingPathComponent:@"image.png"];
    [UIImagePNGRepresentation(image) writeToFile:pathatomically:YES];
    把要處理的圖片, 以image.png名稱存到app home下的Documents目錄里

2)儲(chǔ)存到手機(jī)的圖片庫(kù)里(必須在真機(jī)使用,模擬器無(wú)法使用)
CGImageRef screen = UIGetScreenImage();
UIImage* image = [UIImage imageWithCGImage:screen];
CGImageRelease(screen);
UIImageWriteToSavedPhotosAlbum(image, self, nil, nil);
UIGetScreenImage(); // 原來(lái)是private(私有)api, 用來(lái)截取整個(gè)畫面,不過SDK 4.0后apple就開放了

//====================================================================================

以下代碼用到了Quartz Framework 和 Core Graphics Framework. 在workspace的framework目錄里添加這兩個(gè)framework.在UIKit里,圖像類UIImage和CGImageRef的畫圖操作都是通過Graphics Context來(lái)完成。Graphics Context封裝了變換的參數(shù),使得在不同的坐標(biāo)系里操作圖像非常方便。缺點(diǎn)就是,獲取圖像的數(shù)據(jù)不是那么方便。下面會(huì)給出獲取數(shù)據(jù)區(qū)的代碼。

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

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

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

  1. 對(duì)于特定UIView的截屏。

(可以把當(dāng)前View的layer,輸出到一個(gè)ImageContext中,然后利用這個(gè)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;
}

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

(可以path & clip,以下例子是建一個(gè)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();

  1. 存儲(chǔ)圖像。

(分別存儲(chǔ)到home目錄文件和圖片庫(kù)文件。)

存儲(chǔ)到目錄文件是這樣

NSString *path = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:@"image.png"];
[UIImagePNGRepresentation(image) writeToFile:path atomically:YES];
若要存儲(chǔ)到圖片庫(kù)里面

UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);

  1. 互相轉(zhuǎn)換UImage和CGImage。

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

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

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

(在apple dev上有QA, 不過好像還不支持ios)

下面給出一個(gè)在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;
}

  1. 顯示圖像數(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);

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • UIGraphicsBeginImageContext 創(chuàng)建一個(gè)基于位圖的上下文(context),并將其設(shè)置為當(dāng)...
    李前途閱讀 3,405評(píng)論 1 4
  • UIGraphicsBeginImageContext創(chuàng)建一個(gè)基于位圖的上下文(context),并將其設(shè)置為當(dāng)前...
    宋進(jìn)鋒閱讀 3,758評(píng)論 1 2
  • 1、禁止手機(jī)睡眠[UIApplication sharedApplication].idleTimerDisabl...
    DingGa閱讀 1,211評(píng)論 1 6
  • 學(xué)習(xí)不僅限于書本或課堂,每個(gè)場(chǎng)景都可以變成教育場(chǎng)所。 一副撲克牌也可以玩出多種花樣。它可以教孩子認(rèn)識(shí)數(shù)...
    幸福的三寶媽閱讀 272評(píng)論 0 2
  • 家的方向 是每天在我夢(mèng)里出現(xiàn)的地方 那小河、那粗糧、那麥浪 把我童年的快樂定格在鄉(xiāng)村陌上 曾幾何 面對(duì)夜空,遙看著...
    詩(shī)酒人生閱讀 304評(píng)論 2 1

友情鏈接更多精彩內(nèi)容