powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как получит TBitmap с помощью libjpeg-turbo?
4 сообщений из 4, страница 1 из 1
Как получит TBitmap с помощью libjpeg-turbo?
    #40117593
Емил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ползую LibTurboJPEG.pas отсюда: https://bitbucket.org/egrange/dwscript/src/master/Libraries/GraphicsLib/
Ето libjpeg-turbo. Мне необходимо от jpg файла получит bmp файл. Сделал процедуру которая делает это и она работает как надо.

Моя проблема: как получит из jpg файла дельфийский TBitmap директно - не записивая bmp файл на диска?
Ведь после TJ.Decompress2 у меня есть DecompressBuf с BMP, но ума не приложу как из DecompressBuf сделать TBitmap?
Сейчас записываю через TJ.SaveImage битмап на диск и делаю bitmap.LoadFromFile. Но это медленно и глупо.
Как имея DecompressBuf с BMP получить делфийский TBitmap директно?
(В интернете очень скудная информация по libjpeg-turbo для Делфи.)

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
procedure JpgFileToBmpFile(SourceJPG, DestinationBMP: string);
var
  JpgWidth, JpgHeight, JpgSubsamp: integer;
  DecompressBuf: PByte;
  JpgMS: TMemoryStream;
  DecompressorHandle: TJHandle;
begin
  DecompressorHandle := TJ.InitDecompress;

  // load jpg
  JpgMS := TMemoryStream.Create;
  JpgMS.LoadFromFile(SourceJPG);

  // get jpg width and height
  TJ.DecompressHeader2(DecompressorHandle, JpgMS.Memory, JpgMS.Size, @JpgWidth, @JpgHeight, @JpgSubsamp);

  DecompressBuf := GetMemory(JpgWidth * JpgHeight * 3);
  if DecompressBuf <> nil then
    begin
      // decompress jpg to mem buffer
      TJ.Decompress2(DecompressorHandle, JpgMS.Memory, JpgMS.Size, DecompressBuf, JpgWidth, 0 , JpgHeight, TJPF_RGB ,0);
      // save mem buffer to BMP file
      TJ.SaveImage(PAnsiChar(UTF8Encode(DestinationBMP)), DecompressBuf, JpgWidth, 0 , JpgHeight, TJPF_RGB, 0);

      FreeMemory(DecompressBuf);
    end;

  JpgMS.Free;
  TJ.Destroy(DecompressorHandle);
end;
...
Рейтинг: 0 / 0
Как получит TBitmap с помощью libjpeg-turbo?
    #40117610
Sapersky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
For decompression, use TJ.DecompressHeader2 to obtain the size of the decompressed JPEG image, size your TBitmap accordingly, and then use TJ.Decompress2 to decompress directly to it.
https://www.delphitools.info/2020/10/06/turbojpeg-rocks/
...
Рейтинг: 0 / 0
Как получит TBitmap с помощью libjpeg-turbo?
    #40117621
Емил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уже видел. Не то. Там "...decompress directly to it.", но как не пишет.
Толко "...do whatever you want with the JPEG data in outBuf..." :(
...
Рейтинг: 0 / 0
Как получит TBitmap с помощью libjpeg-turbo?
    #40117622
Sapersky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Почему не пишет-то, подсовывай ему сканлайн битмапа, точно так же, как при кодировании.
Ну или можешь это использовать (модуль cgJpeg):
https://code.google.com/archive/p/delphi-libjpeg-turbo/downloads
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как получит TBitmap с помощью libjpeg-turbo?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]