Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > работа с несжатым jpeg


Автор: jsa 17.7.2006, 18:53
Hi All!

как в делфи (D7) можно работать с сабжем, а именно сжатие  smile  

Автор: DemoCode 17.7.2006, 18:56
У TJPEGImage есть свойство CompressQuality (см. Borland Help) 

Автор: Alexeis 17.7.2006, 20:08
Цитата

работа с несжатым jpeg

Jpeg не бывает несжатым. 
Если имелось ввиду сжатие без потерь, то это JIFF, Делфи не поддерживает jiff 

Автор: jsa 18.7.2006, 05:21
Цитата

У TJPEGImage есть свойство CompressQuality


Код

JPG:=TJPEGImage.Create;
JPG.LoadFromFile('...');
JPG.CompressQuality:=100;
JPG.Compress;
JPG.SaveToFile('1.jpg');
JPG.Free;

после этого 1.jpg имеет размер 0 байт  smile  

Автор: Alexeis 18.7.2006, 09:15
Если перед тем как сжать распаковать картинку в DIB, то все работает 
Код

uses jpeg;
procedure TForm1.btn1Click(Sender: TObject);
var
  jpg : TJpegImage;
begin
 JPG:=TJPEGImage.Create;
 JPG.LoadFromFile('F:\Share\1.jpg');
 JPG.DIBNeeded;
 JPG.CompressionQuality :=100;
 JPG.Compress;
 JPG.SaveToFile('F:\Share\2.jpg');
 JPG.Free;
end;
 

Автор: jsa 18.7.2006, 11:04
не работает, выдает ошибку JPEG error #53 

Автор: Alexeis 18.7.2006, 11:08
jsa, Какая версия Delphi? 

Автор: jsa 18.7.2006, 11:09
я в первом посте писал Delphi 7

Добавлено @ 11:11 
если можно сюда залить картинку размеро 900 кб, я бы залил саму картинку 

Автор: Alexeis 18.7.2006, 11:14
jsa, Этот модуль в delphi говорят плохой, не все поддерживает. Но свой пример я проверял, я его не по памяти писал, проверил даже степень сжатия - и в правду 100%

Добавлено @ 11:16 
Есть два варианта
1) Использовать Intel® JPEG Library
2) GDI+ 

Автор: jsa 18.7.2006, 11:23
alexeis1, у меня это код работает нормально на других картинках, вот только на одной выдается ошибка
offtopic: слышал я чето мельком про intel jpeg library, и вроде как acdsee использует эту библиотеку, а он (acdsee) мою картинку нормально отображает, но пишет что Uncopressed Size и Size имеют одинаковый размер, и после конвертации этой картинки снова в jpeg, Size уменьшается в десятки раз, а Uncopressed Size остается такимже, но главное с этой картинкой можно работать нормально

Добавлено @ 11:24 
есть примеры как использовать IJL? 

Автор: Alexeis 18.7.2006, 11:28
Цитата(jsa @  18.7.2006,  11:23 Найти цитируемый пост)
есть примеры как использовать IJL? 

Не я только недавно сам скачал библу, могу попробовать. 

Автор: Alexeis 18.7.2006, 11:59
А вот и пример
Код

uses  pqGR32_JPEG, GR32;

procedure TForm1.btn1Click(Sender: TObject);
var
   bitmap : TBitmap32;
begin
  bitmap := TBitmap32.Create;
  LoadJPEGFromFile(bitmap, 'F:\Share\1.jpg');
  SaveTo24bitJPEGFile(bitmap, 'F:\Share\2.jpg', 100, True);
  bitmap.Free;
end;
  

Автор: jsa 18.7.2006, 17:42
alexeis1, дай урл откуда качал 

Автор: Girder 18.7.2006, 17:59
вот примерно так... попробуй 

Автор: Alexeis 18.7.2006, 18:06
Вот мой проект со всеми модулями
http://rapidshare.de/files/26181991/12.7z.html 

Автор: EndDie 17.6.2010, 17:40
Цитата(Alexeis @ 18.7.2006,  11:59)
А вот и пример
Код

uses  pqGR32_JPEG, GR32;

procedure TForm1.btn1Click(Sender: TObject);
var
   bitmap : TBitmap32;
begin
  bitmap := TBitmap32.Create;
  LoadJPEGFromFile(bitmap, 'F:\Share\1.jpg');
  SaveTo24bitJPEGFile(bitmap, 'F:\Share\2.jpg', 100, True);
  bitmap.Free;
end;

Господа, доброго времени суток!

При использовании SaveTo24bitJPEGFile почему-то происходит сохранение с именем файла "С", если на диск С:\, "D", если на диск D:\ и т.д.
JPGFile {:= PChar(FileName);} в watch-е показывает корректный путь.

Помогите чем можете!
Заранее благодарю.

Автор: EndDie 22.6.2010, 16:20
Вот сама функция:
Цитата

procedure SaveTo24bitJPEGFile(Bitmap32: TBitmap32; const FileName: string;
  Quality: TIJL_Quality = 75;
  const Progressive_Passes: Boolean = False);
var
  Bitmap: TBitmap;
  DIB: TDIBSection;
  jcprops: TJPEG_CORE_PROPERTIES;
  ret: Integer;
begin
  if Bitmap32.Empty then raise Exception.Create('No image to save');
  FillChar (jcprops, SizeOf (jcprops), 0);
  ret := ijlInit (@jcprops); // Initialises Intel JPEG unit
  if ret <> IJL_OK then raise EIJLError.CreateResFmt(@SIJLError,
    ['initialising for', Filename, ijlErrorStr(ret), ret]);
  try
    Bitmap := TBitmap.Create;
    try
      Bitmap.Assign(Bitmap32);
      Bitmap.PixelFormat := pf24bit;
      FillChar(DIB, SizeOf(DIB), 0);
      if GetObject(Bitmap.Handle, SizeOf (DIB), @DIB) = 0 then
        OutOfMemoryError;
      with jcprops do begin
        DIBWidth := DIB.dsBm.bmWidth;
        DIBHeight := - DIB.dsBm.bmHeight;
        DIBChannels := 3;
        DIBColor := IJL_BGR;
        DIBPadBytes := ((((DIB.dsBm.bmWidth * 3) + 3) div 4) * 4)
          -(DIB.dsBm.bmWidth * 3);
        DIBBytes := PByte(DIB.dsBm.bmBits);
        JPGChannels := 3;
        JPGColor := IJL_YCBCR;
        JPGFile := PChar(FileName);
        jquality := Quality;
        JPGWidth := DIB.dsBm.bmWidth;
        JPGHeight := DIB.dsBm.bmHeight;
        if Progressive_Passes then jprops.progressive_found := 1;
      end;
      ret := ijlWrite(@jcprops, IJL_JFILE_WRITEWHOLEIMAGE);
      if ret <> IJL_OK then raise EIJLError.CreateResFmt(@SIJLError,
        ['Saving', Filename, ijlErrorStr(ret), ret]);
    finally
      Bitmap.Free;
    end;
  finally
    ijlFree(@jcprops);
  end;
end;


в @jcprops путь к файлу для сохранения заносится верно, т.е. дело конечно не в к примеру JPGFile := PChar(FileName);

Остается грешить на отработку в ijl.dll (в моем случае ijl15.dll - Version:  1.51)

ПОМОГИТЕ, плз!

Автор: AntonN 22.6.2010, 21:48
может ему в юникоде путь нужен?

Автор: EndDie 23.6.2010, 07:25
Цитата(AntonN @ 22.6.2010,  21:48)
может ему в юникоде путь нужен?

Не уверен, что это так...

Цитата

 Символьные типы 
 Поддержка Unicode со стороны Delphi изменила способ, в соответствие с которым компилятор обрабатывает символьные типы. Unicode является системой кодирования с двумя байтами на символ, которая поддерживает символы и буквы, использованные во всех языках мира. С целью обратной совместимости ANSIChar является эквивалентом 8-битового Char в Delphi 1.0. WideChar является 16-разрядным символом Unicode. Для совместимости с унаследованным кодом Borland позволяет использование Char, которое по умолчанию совпадает с ANSIChar. Имеются также новые типы символьных указателей, PANSIChar, PWideChar и PChar, которые указывают соответственно на ANSIChar, WideChar и Char. Каждый из указателей работает одинаково. Единственная разница заключается в длине объекта, на который они ссылаются. 


При этом замена присвоения 
JPGFile := PChar(FileName); 
на (к примеру)
JPGFile := PWideChar(FileName);
никаких результатов не дает  smile 

Есть еще идеи? По-прежнему прошу помочь.
Если это имеет значение Дельфи - RAD-2009

Автор: EndDie 23.6.2010, 09:25
После прочтения: http://www.transl-gunsmoker.ru/2009/09/pchars.html#mixing
А также: http://dl.dropbox.com/u/201788/Unicode_Delphi-RUS.pdf

вопрос закрылся следующим образом:

procedure SaveTo24bitJPEGFile(Bitmap32: TBitmap32; const FileName: ansistring;
  Quality: TIJL_Quality = 75;
  const Progressive_Passes: Boolean = False);

Таким образом было достаточно переопределить тип.

Вопрос закрыт, всем спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)