iOS 2D绘图详解(Quartz 2D)之Bitmap
什么是Bitmap?
Bitmap叫做位圖,每一個像素點由1-32bit組成。每個像素點包括多個顏色組件和一個Alpha組件(例如:RGBA)。
iOS中指出如下格式的圖片 JPEG, GIF, PNG, TIF, ICO, GMP, XBM,和 CUR。其他格式的圖片要給Quartz2D傳入圖片的數據分布信息。
數據類型CGImageRef
在Quartz中,Bitmap的數據由CGImageRef封裝。由以下幾個函數可以創建CGImageRef對象
CGImageCreate - 最靈活,但也是最復雜的一種方式,要傳入11個參數,這個方法最后講解。
CGImageSourceCreate-ImageAtIndex-通過已經存在的Image對象來創建
CGImageSourceCreate-ThumbnailAtIndex- 和上一個函數類似,不過這個是創建縮略圖
CGBitmapContextCreateImage - 通過Copy Bitmap Graphics來創建
CGImageCreateWith-ImageInRect -通過在某一個矩形內數據來創建
例子一,在一個bitmap context繪制,并且重新生成一張圖片
先看看一個方法,創建bitmap context-CGBitmapContextCreate
函數體
CGContextRef _Nullable CGBitmapContextCreate (
void * _Nullable data,
size_t width,
size_t height,
size_t bitsPerComponent,
size_t bytesPerRow,
CGColorSpaceRef _Nullable space,
uint32_t bitmapInfo
);
參數
data 是一個指針,指向存儲繪制的bitmap context的實際數據的地址,最少大小為bytesPerRow* height.可以傳入null,讓quartz自動分配計算
width/height bitmap的寬度,高度,以像素為單位
bytesPerRow 每一行的byte數目。如果data傳入null,這里傳入0,則會自動計算
一個component占據多少位。對于32bit的RGBA空間,則是8(8*4=32)。
space 顏色空間,一般就是DeviceRGB
bitmapInfo,一個常量,指定了是否具有alpha通道,alpha通道的位置,像素點存儲的數據類型是float還是Integer等信息。
其中bitmapInfo可以傳入的參數如下,通過名字就能看出來,這里不加注釋了
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這個方法
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
);
參數
width/height 圖片的像素寬度,高度
bitsPerComponent 每個component的占用bit個數,和上文提到的一樣
bitsPerPixel 每個像素點占用的bit個數。例如32bit RGBA中,就是32
bytesPerRow 每一行占用的byte個數
colorspace 顏色空間
bitmapInfo 和上文提到的那個函數一樣
provider bitmap的數據源
decode 解碼array,傳入null,則保持原始數據
interpolation 是否要像素差值來平滑圖像
intent 指定了從一個顏色空間map到另一個顏色空間的方式
UIKit中的Bitmap
成對使用來創建bitmap context,進行繪制
UIGraphicsBeginImageContext
UIGraphicsEndImageContext
通過一下方法來獲取當前context就可以繪制了。
UIGraphicsGetCurrentContext
然后通過,UIGraphicsGetImageFromCurrentImageContext來生成圖片
例如
調整圖片的大小
+ (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();
總結
以上是生活随笔為你收集整理的iOS 2D绘图详解(Quartz 2D)之Bitmap的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Transform 详细讲解
- 下一篇: xslt中的常用函数