Здравствуйте. Для работы с jpeg я использую IJL. Возникли несколько вопросов про цвет.Я кодирую TBitmap (код, именно в таком виде - работает исправно):
function encodeJPEG(var size:cardinal;bmp:TBitmap):pbyte;
var
jpegprops : TJPEG_CORE_PROPERTIES;
iNChannels : Integer;
DIB : TDIBSection;
pBuf:pbyte;
begin
ijlInit(@jpegprops);
FillChar(DIB,SizeOf(DIB),0);
GetObject(bmp.Handle,SizeOf(DIB),@DIB);
iNChannels := 3;
jpegprops.DIBWidth := DIB.dsBm.bmWidth;
jpegprops.DIBHeight := -DIB.dsBm.bmHeight;
jpegprops.DIBChannels := iNChannels;
jpegprops.DIBColor := IJL_BGR;
jpegprops.DIBPadBytes := ((((DIB.dsBm.bmWidth*iNChannels)+3) div 4)*4)-(DIB.dsBm.bmWidth*3);
size:=DIB.dsBm.bmWidth*DIB.dsBm.bmHeight*iNChannels;
jpegprops.DIBBytes := PByte(DIB.dsBm.bmBits);
pBuf:=AllocMem(size);
jpegprops.JPGSizeBytes := size;
jpegprops.JPGBytes := pBuf;
jpegprops.JPGFile := nil;
jpegprops.JPGWidth := DIB.dsBm.bmWidth;
jpegprops.JPGHeight := DIB.dsBm.bmHeight;
jpegprops.JPGChannels := 3;
jpegprops.JPGColor := IJL_YCBCR;
jpegprops.jquality := 0;
jpegprops.jprops.JPGFile:=nil;
jpegprops.jprops.state.hFile := nil;
ijlWrite(@jpegprops,IJL_JBUFF_WRITEWHOLEIMAGE);
ReallocMem(pBuf,jpegprops.JPGSizeBytes);
size:=jpegprops.JPGSizeBytes;
ijlFree(@jpegprops);
result:=pbuf;
end;
(Для просмотра полученного jpg вывожу его в файл)
В данном случае, когда всё правильно работает:
№1jpegprops.DIBColor=IJL_BGR
jpegprops.JPGColor=IJL_YCBCR
cледовательно, в моем tbitmap цвета представлены в виде BGR, IJL переводит эту схему в YCbCr (об этом прочитал в википедии :) )
Экспериментирую:
№2jpegprops.DIBColor=IJL_RGB
jpegprops.JPGColor=IJL_YCBCR
у полученного jpeg меняются местами красный и синий каналы (при просмотре это видно)
№3jpegprops.DIBColor=IJL_YCBCR
jpegprops.JPGColor=IJL_YCBCR
вообще другая интерпретация цветов - всё в порядке, как и должно быть
№5jpegprops.DIBColor=IJL_RGB
jpegprops.JPGColor=IJL_RGB
кодировка удается, но изображение получается более расплывчатым, чем в №1. Почему?
№5jpegprops.DIBColor=IJL_BGR
jpegprops.JPGColor=IJL_BGR
вроде, должно полуиться то же, что в №4. Но кодировка не удается (ijlWrite=-8). Почему?
Далее
Как я понимаю, буква А в IJL_RGBA_FPX и IJL_YCBCRA_FPX означает alpha. Вопрос: как задействовать этот канал? Допустим, есть bmp - хочу, чтобы у jpg, который я получу их этого bmp, слева направо прозрачность уменьшалась.
Заранее спасибо.