en

hi, it seems you are using microsoft internet explorer. it doesn't match web standard and causes problems browsing this site. please please please use mozilla firefox or google chrome instead. thank you!

zh

哦哦!您正在使用Internet Explorer 瀏覽器,它與我們的網頁標準並不相容,可能會導致畫面顯示不正常。
請改用 Mozilla Firefox 或者 Google Chrome 才能正常瀏覽本網站,謝謝!

4.09.2012

影像與資料陣列的轉換(下)

 

在先前的文章影像與資料陣列的轉換(上)一文中,已經可以將 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 的建立失敗。






沒有留言:

張貼留言