在先前的文章影像與資料陣列的轉換(上)一文中,已經可以將 32 位元深度影像與自行定義的資料結構之間做轉換,但是面對其他格式的影像,例如 CMYK 或是 8 位元深度的的影像時該怎麼做呢?
首先,我們要先確定此影像是屬於哪種 Color Spaces,並且確認影像是否有包含 Alpha Channel,在確認上述資訊之後,你可以透過 MAC OS X Developer Library 來確認此影像在 CGBitmapContext 中的資訊分布方式,以 RGB, kCGImageAlphaPremultipliedLast 為例,他的資訊分布是 RGBA 並非 ARGB,因此在之前的文章中所定一的資料結構順序必須為 RGBA,如果你採用的是 kCGImageAlphaPremultipliedFirst,那麼資料結構的順序就必須改為 ARGB。
下面我們以 8 位元深度的灰階影像為例,使用 Gray, kCGImageAlphaNone 來製作 CGBitmapContext。
//將圖片轉換成 CGImageRef 格式並取得大小
CGImageRef imageRef = [myImageView.image CGImage];
int width = CGImageGetWidth(imageRef);
int height = CGImageGetHeight(imageRef);
//資料結構的參數和色域
NSUInteger bytesPerPixel = 1;
NSUInteger bytesPerRow = bytesPerPixel * width;
NSUInteger bitsPerComponent = 8;
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
//宣告一個與圖片大小相同的資料結構一維陣列
unsigned char *sourceData = malloc(height * width * bytesPerPixel);
//將圖片資訊寫入資料結構陣列中
CGContextRef context = CGBitmapContextCreate(sourceData,
width,
height,
bitsPerComponent,
bytesPerRow,
colorSpace,
kCGImageAlphaNone);
CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);
//再由CGContextRef轉成CGImageRef
CGImageRef cgImage=CGBitmapContextCreateImage(context);
//放入UIImageView
[myImageView setImage:[UIImage imageWithCGImage:cgImage]];
最後, colorSpaces、bytesPerPixel 和 bitsPerComponent 的參數,都必須要符合影像資料結構的模型,不然會導致 CGContextRef 的建立失敗。
沒有留言:
張貼留言