Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как получит TBitmap с помощью libjpeg-turbo? / 4 сообщений из 4, страница 1 из 1
05.12.2021, 23:31
    #40117593
Емил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получит TBitmap с помощью libjpeg-turbo?
Ползую 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
06.12.2021, 00:19
    #40117610
Sapersky
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получит TBitmap с помощью libjpeg-turbo?
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
06.12.2021, 01:09
    #40117621
Емил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получит TBitmap с помощью libjpeg-turbo?
Уже видел. Не то. Там "...decompress directly to it.", но как не пишет.
Толко "...do whatever you want with the JPEG data in outBuf..." :(
...
Рейтинг: 0 / 0
06.12.2021, 01:48
    #40117622
Sapersky
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получит TBitmap с помощью libjpeg-turbo?
Почему не пишет-то, подсовывай ему сканлайн битмапа, точно так же, как при кодировании.
Ну или можешь это использовать (модуль cgJpeg):
https://code.google.com/archive/p/delphi-libjpeg-turbo/downloads
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как получит TBitmap с помощью libjpeg-turbo? / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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