iOS4からCFDataGetBytePtrの戻りが以前と異なる問題について

CFDataGetBytePtr(CGDataProviderCopyData(CGImageGetDataProvider(cgImage))); で取得したイメージRAWデータがiPhoneiPadで違うよ。いちいち躓く俺・・・ ダメだな。

Hideki Suzuki on Twitter: "CFDataGetBytePtr(CGDataProviderCopyData(CGImageGetDataProvider(cgImage))); で取得したイメージRAWデータがiPhoneとiPadで違うよ。いちいち躓く俺・・・ ダメだな。"

CFDataGetBytePtrで取ったデータのRGBAの順番は取得できるんでしょうか?環境によって順序が違うようで…シミュレータの問題なのかな

iphone_dev_jp on Twitter: "CFDataGetBytePtrで取ったデータのRGBAの順番は取得できるんでしょうか?環境によって順序が違うようで…シミュレータの問題なのかな [@haruuraran]"

そもそもの問題として、実機とシミュレータで異なる。

iPhone4をベースSDKに変更したら、ピクセルの色データがrgbaからargbの順に変わった希ガス。そう言う仕様変更?それとも、なんか自分が悪いのか。

http://twitter.com/moringo/statuses/16779965874

それがどうもiOS4から実機とシミュレータで同じになっているようなのだ。なんでこんなうんこみたいなことになっているのか。CFDataGetBytePtrで生データ取るやり方はApple的には非推奨なんじゃねーの?とか疑って調べてみると、こういう記事が出てきた。

CGBitmapContextCreateを使うとよしなにやってくれるらしい。

before

CGDataProviderRef dataProvider = CGImageGetDataProvider(originalImage.CGImage);
CFDataRef dataRef = CGDataProviderCopyData(dataProvider);
char *buffer = (char*)CFDataGetBytePtr(dataRef);
CFRelease(dataRef);

after

CGImageRef cgImage = originalImage.CGImage;
size_t width = CGImageGetWidth(cgImage);
size_t height = CGImageGetHeight(cgImage);

char *buffer = (char*)malloc(sizeof(char) * width * height * 4);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef cgContext = CGBitmapContextCreate(buffer, width, height, 8, width * 4, colorSpace, kCGImageAlphaPremultipliedLast);
CGContextSetBlendMode(cgContext, kCGBlendModeCopy);
CGContextDrawImage(cgContext, CGRectMake(0.0f, 0.0f, width, height), cgImage);

free(buffer);
CGContextRelease(cgContext);
CGColorSpaceRelease(colorSpace);