Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сохранение TBitMap в формате JPEG [D7, Win2k, WinXP]


kmi ©   (2006-03-27 12:52:00) 

Друзья, помогите решить проблемку. У меня есть объект TBitMap, изображение которого нужно сохранить в JPEG с качеством не ниже 90, затем распознать это изображение.

Я делаю так:

var
 Bmp: TBitMap;
 JPG: TJPEGImage;

Bmp := MCD.GetBitmap;  // получаю изображение
if (Bmp = nil) // проверяю
 then
   begin
     MCD.ShowErrorMsg('Ошибка');
     Exit;
   end;
JPG := TJPEGImage.Create; // модуль JPEG указан в uses
try
 JPG.Assign(BMP); // присваиваю данные из TBitMap
 JPG.PixelFormat := jf24Bit; // указываю формат
 JPG.SaveToFile(AppPath + 'Images\Psp.jpg'); // сохраняю
finally
 JPG.Free;
end;


Файл сохраняется, открывается в любом редакторе, но... вызывает ошибку при распознании. Подскажите, в чем ошибка или како другой способ сохранения TBitMap в JPEG-файл.


kmi   (2006-03-28 23:02:00) [1]

Решение см. http://www.delphimaster.ru/cgi-bin/forum.pl?id=1143532496&n=7


kmi   (2006-03-28 17:54:00) [2]

Причина сбоя - разрешение сохраняемого изображения. Для нормального распознания нужно около 300 dpi, а Delphi сохраняет всегда с 96 dpi.


kmi   (2006-03-28 11:26:00) [3]

Нашел возможную причину: разрешение 96 точек на дюйм, а надо 300.

Подскажите, как сохранить изображение в JPEG с нужным разрешением.


kmi   (2006-03-27 21:12:00) [4]

pf24bit прогресса не дает, хотя размер файла сохраняется при конверсии JPEG - TBitmap - JPEG.


SamBrook   (2006-03-27 17:12:00) [5]

А pixelformat какой?
Попробуйте принудительно pf24bit


kmi   (2006-03-27 17:00:00) [6]

Возвращает BMP.HandleType = bmDIB, здесь все в норме.


SamBrook   (2006-03-27 16:32:00) [7]

Видимо у Вас tbitmap содержит DDB а не DIB.
Т.Е. надо перед сохранением проверять:

if bitmap.handleType<>bmDIB then //скверно ругаться


kmi   (2006-03-27 15:52:00) [8]

Заметил, что даже если я беру заведомо распознаваемый jpg-файл, загружаю в TBitMap, а затем сохраняю указанным способом, новый файл не распознается и при этом "худеет" вдвое при тех же размерах.


kmi   (2006-03-27 15:44:00) [9]

Пробовал. Задавал JPG.CompressionQuality:=100, но все равно не помогает.


SamBrook   (2006-03-27 13:59:00) [10]

JPG.Compress забыли.
Вот так работает:

 procedure tbitmaptojpgfile(bitmap:tbitmap;
                                    compressionlevel:byte;
                                    jpgfilename:string);
 var jpg:tjpegimage;
 begin
    jpg:=tjpegimage.create;
    with jpg do
    try
      Assign(bitmap);
      CompressionQuality:=compressionlevel;
      Smoothing:=true;
      Compress;
      SaveToFile(jpgfilename);
   finally  
     free;
   end;
 end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо