Я думаю, что R B G не так. У вас есть:
UInt8 red = data[offset];
UInt8 blue = data[offset+1];
UInt8 green = data[offset+2];
Но разве вы не имеете в виду R G B ? :
UInt8 red = data[offset];
UInt8 green = data[offset+1];
UInt8 blue = data[offset+2];
Но даже с этим исправлением все еще остается проблема, так как выясняется, что Apple переставляет байты (отличная статья) значения R и B на устройстве, но не на тренажер.
У меня была похожая проблема симулятора / устройства с пиксельным буфером PNG, возвращаемым CFDataGetBytePtr.
Это решило проблему для меня:
#if TARGET_IPHONE_SIMULATOR
UInt8 red = data[offset];
UInt8 green = data[offset + 1];
UInt8 blue = data[offset + 2];
#else
//on device
UInt8 blue = data[offset]; //notice red and blue are swapped
UInt8 green = data[offset + 1];
UInt8 red = data[offset + 2];
#endif
Не уверен, что это решит вашу проблему, но ваш некорректно работающий код выглядит примерно так, как выглядел мой, до того, как я его исправил.
И последнее: я думаю, что симулятор позволит вам получить доступ к вашему пиксельному буферу data[]
даже после вызова CFRelease(bitmapData)
. На устройстве это не дело в моем опыте. Ваш код не должен быть затронут, но в случае, если это поможет кому-то еще, я подумал, что упомяну это.