ОС - Windows XP SP3
IDE - Lazarus 0.9.28.2 бета + winCE
Все банально - на форме Image. На FormCreate прописано :
var SelfPath: string;
TmpBmp: TBitMap;
begin
SelfPath := trim( ExtractFilePath(ParamStr(0)) );
Image1.Picture.Bitmap.LoadFromFile( SelfPath+'\BitMapIN.bmp' );
Application.ProcessMessages;
Image1.Picture.Bitmap.SaveToFile( SelfPath+'\BitMapOUT.bmp' );
Application.ProcessMessages;
Image1.Picture.LoadFromFile( SelfPath+'\JpegIN.jpg' );
Application.ProcessMessages;
TmpBmp := TBitMap.Create;
TmpBmp.PixelFormat := pf16bit;
TmpBmp.Assign(Image1.Picture.Graphic);
TmpBmp.SaveToFile( SelfPath+'\JpegOUT.bmp' );
Application.ProcessMessages;
TmpBmp.Free;
end;
BitMapIN.bmp - картинка с машинкой, 480x272 пикселей 16 бит. Размер файла 261 176 байт (кратный 4-ём)
JpegIn.jpg - таже самая машинка но конвертированая фотошопом из BMP в Jpeg.
После компиляции под Win32 получаю : BitMapOUT = BitMapIN (не считая недостающих 2-ух $00 байт в конце, которые в исходном битмапе были добавлены фотошопом для кратности 4). А вот JpegOUT - все время 32 битный, не взирая на PixelFomat...
Отсюда первый вопрос - а работает ли корректно PixelFormat в лазаре??? Если да - то как его надо применять?..
Второй вопрос : Все тоже самое, но код на FormCreate чуть изменен:
var SelfPath: string;
TmpBmp: TPicture;
begin
SelfPath := trim( ExtractFilePath(ParamStr(0)) );
Image1.Picture.Bitmap.LoadFromFile( SelfPath+'\BitMapIN.bmp' );
Application.ProcessMessages;
Image1.Picture.Bitmap.SaveToFile( SelfPath+'\BitMapOUT.bmp' );
Application.ProcessMessages;
Image1.Picture.LoadFromFile( SelfPath+'\JpegIN.jpg' );
Application.ProcessMessages;
TmpBmp := TPicture.Create;
TmpBmp.Bitmap.PixelFormat := pf16bit;
TmpBmp.Bitmap.Assign(Image1.Picture.Graphic);
TmpBmp.Bitmap.SaveToFile( SelfPath+'\JpegOUT.bmp' );
Application.ProcessMessages;
TmpBmp.Free;
end;
То есть динамически создаем не BitMap, а Picture (т.к. при компиляции под WinCE для arm лазарь не хочет создавать битмапы).
Компилирую все это дело под WinCE и запускаю на навигаторе ACER p610 c WinCE 5.0.
В итоге получаем - BitMapOUT = BitMapIN (не считая недостающих 2-ух $00 байт в конце, которые в исходном битмапе были добавлены фотошопом для четности).
JpegOUT - 16 битный, но его размер 261 186 (не кратный 4-ем), добавлены 10 байт в заголовок DIB, полностью другое содержимое файла (байтики) - что свидетельствует о другой используемой палитре, и этот BMP невозможно потом загрузить ни в один компонент программы под WinCE. То есть : при попытке открыть его на WinCE стандартными средствами ОС - он отрывается. Если попытаться загрузить его в программу написанную на лазаре, например банально - Picture.LoadFromFile() или Picture.Bitmap.LoadFromFile() (перепробовал любые варианты) - прога тутже вываливается в ошибку - Bus error, misaligned data - что, на сколько я понимаю свидетельствует о том, что Arm-процессор читает по 4 байта, а в этом файле данные не кратны 4.
Отсюда второй, третий и четвертый вопросы:
2. Правильно ли я трактовал ошибку про Bus error и Misaligned data?
3. Почему при всем при этом нормально загружается BitMapOUT, у которого размер 261 174 - который также не кратный 4-ём (хотя, на сколько я понимаю, данные о цветах пикселей в нем все равно (как и в JpegOUT) должны быть кратными - 480*272*2 = 261120; 261120 div 4 = 0).
4. Почему стандартные средства ОС могут отрыть и прочитать JpegOUT, а прога под лазарем вываливает в ошибку? Как прочитать и загрузить этот файл???
PS: Перепробовал уже все известные мне способы сохранения и открытия - ничего не помогает. Все равно вываливается в ошибу...
PS2: Пробовал создавать отдельно заголовок BMP и дополнять его нужными байтами, попиксельно читая канву JPEG-а - сработало нормально, получился нормальный бмпшник, но это очень долго...
PS3: Сохранять картинку надо именно в BMP формате.