iOS4からCFDataGetBytePtrの戻りが以前と異なる問題について
CFDataGetBytePtr(CGDataProviderCopyData(CGImageGetDataProvider(cgImage))); で取得したイメージRAWデータがiPhoneとiPadで違うよ。いちいち躓く俺・・・ ダメだな。
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);