Почему iphone CGImageCreate с данными из стандартных битов BMP дает неправильный результат?

У меня есть движок gdi, который приводит к стандартному потоку битов BMP, и теперь я хочу отображать его с помощью CG в iphone, я использую его так:

// size  -> image size 
// rect  -> current view rect
// pBits -> the BITMAPINFO image bits stream

long imgSizePerRow = ((long)(24 * size.width + 31) / 32) * 4;
CGDataProviderRef providerRef = CGDataProviderCreateWithData(NULL, pBits,
                                          imgSizePerRow * size.height, NULL);

CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();

CGImageRef imageRef = CGImageCreate(size.width, size.height, 8, 24,
                                    imgSizePerRow, colorSpaceRef,
                                    kCGBitmapByteOrderDefault, providerRef,
                                    NULL, YES, kCGRenderingIntentDefault);

CGContextDrawImage(context, rect, imageRef);

CGImageRelease(imageRef);
CGColorSpaceRelease(colorSpaceRef);
CGDataProviderRelease(providerRef);

внимание: проверяю соответствие пикселя строки разу 4

Мой gdi генерирует поток битов, в данном случае формат R8G8B8, без альфа-канала, я использую его для CGDataProviderRef и рисую CGImage в моем представлении. странно, что цвет изображения кажется изменившимся, но вся форма выглядит нормально, я сохраняю битовый поток с помощью BITMAP FORMAT в файл раньше и делаю контраст, все выглядит нормально, только все цветовое пространство.

Может ли кто-нибудь сказать мне, в чем моя ошибка в коде, или я пропустил какой-то пункт. параметр?


person Eric    schedule 16.04.2009    source источник


Ответы (2)


CGImageCreate принимает необработанные пиксели, в отличие от файла .bmp (у него есть заголовок «BITMAPINFO»). Вместо этого создайте UIImage с данными .bmp, а затем получите CGImage из этого объекта.

person Peter Hosey    schedule 16.04.2009
comment
Привет Питер . На самом деле я использую необработанные пиксели растрового изображения и просто использую заголовок BTIMAPINFO для параметра настройки (я не создаю CGImage из информации заголовка)? - person Eric; 17.04.2009
comment
Предполагая, что нет запасных данных после данных растрового изображения, следующее, на что я обращаю внимание, - это арифметика. В этом случае я с подозрением отношусь к вашему вычислению imgSizePerRow. Почему танец (+31) / 32? Почему бы просто не умножить на четыре? - person Peter Hosey; 17.04.2009

Я упустил важный момент: мой поток битовых карт GDI упорядочен по B8-> G8-> R8.

person Eric    schedule 17.04.2009
comment
Итак, что вы изменили в своем коде, чтобы он работал правильно? - person Alexander Abakumov; 12.03.2018