iOS 2D绘图详解(Quartz 2D)之Bitmap
什么是Bitmap?
Bitmap叫做位圖,每一個(gè)像素點(diǎn)由1-32bit組成。每個(gè)像素點(diǎn)包括多個(gè)顏色組件和一個(gè)Alpha組件(例如:RGBA)。
iOS中指出如下格式的圖片 JPEG, GIF, PNG, TIF, ICO, GMP, XBM,和 CUR。其他格式的圖片要給Quartz2D傳入圖片的數(shù)據(jù)分布信息。
數(shù)據(jù)類型CGImageRef
在Quartz中,Bitmap的數(shù)據(jù)由CGImageRef封裝。由以下幾個(gè)函數(shù)可以創(chuàng)建CGImageRef對象
CGImageCreate - 最靈活,但也是最復(fù)雜的一種方式,要傳入11個(gè)參數(shù),這個(gè)方法最后講解。
CGImageSourceCreate-ImageAtIndex-通過已經(jīng)存在的Image對象來創(chuàng)建
CGImageSourceCreate-ThumbnailAtIndex- 和上一個(gè)函數(shù)類似,不過這個(gè)是創(chuàng)建縮略圖
CGBitmapContextCreateImage - 通過Copy Bitmap Graphics來創(chuàng)建
CGImageCreateWith-ImageInRect -通過在某一個(gè)矩形內(nèi)數(shù)據(jù)來創(chuàng)建
例子一,在一個(gè)bitmap context繪制,并且重新生成一張圖片
先看看一個(gè)方法,創(chuàng)建bitmap context-CGBitmapContextCreate
函數(shù)體
CGContextRef _Nullable CGBitmapContextCreate (
void * _Nullable data,
size_t width,
size_t height,
size_t bitsPerComponent,
size_t bytesPerRow,
CGColorSpaceRef _Nullable space,
uint32_t bitmapInfo
);
參數(shù)
data 是一個(gè)指針,指向存儲繪制的bitmap context的實(shí)際數(shù)據(jù)的地址,最少大小為bytesPerRow* height.可以傳入null,讓quartz自動(dòng)分配計(jì)算
width/height bitmap的寬度,高度,以像素為單位
bytesPerRow 每一行的byte數(shù)目。如果data傳入null,這里傳入0,則會(huì)自動(dòng)計(jì)算
一個(gè)component占據(jù)多少位。對于32bit的RGBA空間,則是8(8*4=32)。
space 顏色空間,一般就是DeviceRGB
bitmapInfo,一個(gè)常量,指定了是否具有alpha通道,alpha通道的位置,像素點(diǎn)存儲的數(shù)據(jù)類型是float還是Integer等信息。
其中bitmapInfo可以傳入的參數(shù)如下,通過名字就能看出來,這里不加注釋了
enum CGImageAlphaInfo {
kCGImageAlphaNone,
kCGImageAlphaPremultipliedLast,
kCGImageAlphaPremultipliedFirst,
kCGImageAlphaLast,
kCGImageAlphaFirst,
kCGImageAlphaNoneSkipLast,
kCGImageAlphaNoneSkipFirst,
kCGImageAlphaOnly
};
原圖(1280*800)
效果
重新繪制成200*100,并在圖片中間加上我們自定義的繪制
代碼
CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();
CGSize targetSize = CGSizeMake(200, 100);
CGContextRef bitmapContext = CGBitmapContextCreate(NULL,
targetSize.width,
targetSize.height,
8,
targetSize.width * 4,
rgb,
kCGImageAlphaPremultipliedFirst);
CGRect imageRect;
imageRect.origin = CGPointMake(0, 0);
imageRect.size = targetSize;
UIImage * imageToDraw = [UIImage imageNamed:@"image.jpg"];
CGContextDrawImage(bitmapContext,imageRect,imageToDraw.CGImage);
CGContextAddArc(bitmapContext,100,40, 20,M_PI_4, M_PI_2, true);
CGContextSetLineWidth(bitmapContext, 4.0);
CGContextStrokePath(bitmapContext);
CGImageRef imageRef = CGBitmapContextCreateImage(bitmapContext);
UIImage * image = [[UIImage alloc] initWithCGImage:imageRef];
CGImageRelease(imageRef);
CGContextRelease(bitmapContext);
CGColorSpaceRelease(rgb);
UIImageView * imageView = [[UIImageView alloc] initWithImage:image];
imageView.center = self.view.center;
[self.view addSubview:imageView];
例子二,截取圖片的一部分
效果
代碼
UIImage * imageToDraw = [UIImage imageNamed:@"image.jpg"];
CGImageRef partImageRef = CGImageCreateWithImageInRect(imageToDraw.CGImage, CGRectMake(0, 0,300, 200));
UIImage * partImage = [[UIImage alloc] initWithCGImage:partImageRef];
UIImageView * imageView = [[UIImageView alloc] initWithImage:partImage];
imageView.center = self.view.center;
[self.view addSubview:imageView];
看看CGImageCreate這個(gè)方法
CGImageRef _Nullable CGImageCreate (
size_t width,
size_t height,
size_t bitsPerComponent,
size_t bitsPerPixel,
size_t bytesPerRow,
CGColorSpaceRef _Nullable space,
CGBitmapInfo bitmapInfo,
CGDataProviderRef _Nullable provider,
const CGFloat * _Nullable decode,
bool shouldInterpolate,
CGColorRenderingIntent intent
);
參數(shù)
width/height 圖片的像素寬度,高度
bitsPerComponent 每個(gè)component的占用bit個(gè)數(shù),和上文提到的一樣
bitsPerPixel 每個(gè)像素點(diǎn)占用的bit個(gè)數(shù)。例如32bit RGBA中,就是32
bytesPerRow 每一行占用的byte個(gè)數(shù)
colorspace 顏色空間
bitmapInfo 和上文提到的那個(gè)函數(shù)一樣
provider bitmap的數(shù)據(jù)源
decode 解碼array,傳入null,則保持原始數(shù)據(jù)
interpolation 是否要像素差值來平滑圖像
intent 指定了從一個(gè)顏色空間map到另一個(gè)顏色空間的方式
UIKit中的Bitmap
成對使用來創(chuàng)建bitmap context,進(jìn)行繪制
UIGraphicsBeginImageContext
UIGraphicsEndImageContext
通過一下方法來獲取當(dāng)前context就可以繪制了。
UIGraphicsGetCurrentContext
然后通過,UIGraphicsGetImageFromCurrentImageContext來生成圖片
例如
調(diào)整圖片的大小
+ (UIImage*)imageWithImage:(UIImage*)image
scaledToSize:(CGSize)newSize;
{
UIGraphicsBeginImageContext( newSize );
[image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
截屏
UIWindow * keyWindow = [UIApplication sharedApplication].keyWindow;
UIGraphicsBeginImageContextWithOptions(keyWindow.bounds.size, NO, [UIScreen mainScreen].scale);
CGContextRef context = UIGraphicsGetCurrentContext();
[keyWindow.layer renderInContext:context];
UIImage * screenShot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
總結(jié)
以上是生活随笔為你收集整理的iOS 2D绘图详解(Quartz 2D)之Bitmap的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Transform 详细讲解
- 下一篇: xslt中的常用函数