-
Здравствуйте. Я работаю с JPG при помощи Intel JPG Library (IJL) Хочу сделать функцию, кодирующую изображение из TBitmap в жпг-формат и записывающую полученную информацию в память. Ввод - объект класса TBitmap, вывод - адрес в памяти и размер информации.
Делаю так (взял из сэмпла, но что-то тут не пашет, смотрите комментарии): [Code]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; //три канала - RGB (без альфа) 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.JPGFile := nil; jpegprops.JPGWidth := DIB.dsBm.bmWidth; jpegprops.JPGHeight := DIB.dsBm.bmHeight; jpegprops.JPGChannels := 3; jpegprops.JPGColor := IJL_YCBCR; jpegprops.jquality := 70; jpegprops.jprops.JPGFile:=nil; jpegprops.jprops.state.hFile := nil; ijlWrite(@jpegprops,IJL_JBUFF_WRITEWHOLEIMAGE); ReallocMem(pBuf,jpegprops.JPGSizeBytes);// тут, как я думал, после предыдущей строчки jpegprops.JPGSizeBytes уже должно принять настоящее значение размера полученного jpg, но это не так - jpegprops.JPGSizeBytes остался равным size size:=jpegprops.JPGSizeBytes; ijlFree(@jpegprops); result:=pbuf; end; [/Code]
При записи полученной информации в файл и сравнивании этого файла с полученным с помощью Picture.SaveToFile (сохранение картинки в bmp) наблюдаю полное сходство в размерах jpg- и bmp-файлов. Но jpg, в отличие от bmp, не открывается (ясен-красен, почему...)
Вопрос: как же решить задачу с нахождением настоящего размера полученной от кодировки информации?
-
Уже подсказали: не указал jpegprops.JPGBytes := pBuf;
|