Конференция "Media" » IJL - как при кодировке узнать размер полученной информации [D7, WinXP]
 
  • Pasha L © (31.07.07 20:01) [0]
    Здравствуйте.
    Я работаю с 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, не открывается (ясен-красен, почему...)

    Вопрос: как же решить задачу с нахождением настоящего размера полученной от кодировки информации?
  • Pasha L © (01.08.07 15:59) [1]
    Уже подсказали: не указал jpegprops.JPGBytes := pBuf;
 
Конференция "Media" » IJL - как при кодировке узнать размер полученной информации [D7, WinXP]
Есть новые Нет новых   [134431   +10][b:0][p:0]