Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как сохранить TBitMap в файл типа TIFF / 23 сообщений из 23, страница 1 из 1
02.11.2017, 19:28:11
    #39546957
Vladimir1212
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить TBitMap в файл типа TIFF
Довольно просто средствами Delphi сохранить изображение в формате BMP .
В JPEG - тоже понятно. Делал так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
uses JPEG;
......
            With TJpegImage.Create do try
            Assign(BitMap);
            CompressionQuality := JPEG_TrackBar.Position; // Например, 60
            SaveToFile(FileName);
            end;


Сейчас есть необходимость сохранить bmp-картинку в файл типа TIFF .
Как это оперативно сделать, не подключая огромные сторонние библиотеки?
Delphi XE8, Win10
...
Рейтинг: 0 / 0
02.11.2017, 20:07:21
    #39546973
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить TBitMap в файл типа TIFF
Vladimir1212,

Как вариант . Правда пишут что тестировался только на XE2, но, возможно, и выше заработает.
...
Рейтинг: 0 / 0
02.11.2017, 20:18:33
    #39546980
Соколинский Борис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить TBitMap в файл типа TIFF
Vladimir1212,

файл типа TIFF - просто контейнер, внутри может быть что угодно, вплоть до проприетарных форматов.
Если нужен uncompressed или LZW, можно GDI+ задействовать.
...
Рейтинг: 0 / 0
02.11.2017, 20:34:01
    #39546989
Vladimir1212
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить TBitMap в файл типа TIFF
SynGDIPlus - пробовал: огромная библиотека, старая, с кучей ненужных мне функций. После её подключения не удалось в TIFF сохранить (пустой файл на выходе). Причём сохранение в JPEG тоже перестало работать.
===
GDI+ - смотрел в эту сторону. Это использование стандартных функций из gdiplus.dll ?
Нужен пример...
...
Рейтинг: 0 / 0
02.11.2017, 21:28:07
    #39547012
Соколинский Борис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить TBitMap в файл типа TIFF
Vladimir1212,
Пример есть в стандартных демках.
...
Рейтинг: 0 / 0
02.11.2017, 23:01:08
    #39547056
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить TBitMap в файл типа TIFF
...
Рейтинг: 0 / 0
03.11.2017, 10:51:34
    #39547229
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить TBitMap в файл типа TIFF
Vladimir1212SynGDIPlus - пробовал: огромная библиотека, старая, с кучей ненужных мне функций.
Мы точно об одном говорим? Сейчас сделал тестовый пример - консольное приложение, размером 140 Кб, нормально конвертит файлы из jpg в tiff. Главный недостаток - максимальное сжатие только LZW, так что файлы получаются огромные :)
...
Рейтинг: 0 / 0
03.11.2017, 10:55:02
    #39547233
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить TBitMap в файл типа TIFF
Ну и вот еще вариант: https://github.com/mike-lischke/GraphicEx
...
Рейтинг: 0 / 0
03.11.2017, 12:10:27
    #39547302
Vladimir1212
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить TBitMap в файл типа TIFF
Если не затруднит, скиньте консольное приложение вместе с библиотекой SynGDIplus (*.pas + *.inc файл).
Пробовал несколько раз: просто прочитать из файла Bitmap процедурой из SynGDIplus (Load), потом сохранить его в jpg или Tiff (там можно и так, и так). Упорно получаю пустой файл на выходе!
...
Рейтинг: 0 / 0
03.11.2017, 13:03:39
    #39547353
Vladimir1212
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить TBitMap в файл типа TIFF
Пример нашёл. Но при компиляции под Win64 он затыкается. Корректно работает только под Win32
...
Рейтинг: 0 / 0
03.11.2017, 13:38:58
    #39547399
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить TBitMap в файл типа TIFF
Vladimir1212Пример нашёл. Но при компиляции под Win64 он затыкается. Корректно работает только под Win32
Библиотека последней версии?
У меня вот так в Delphi XE2 x64 нормально работает
Код: 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.
program tiff_test;

{$APPTYPE CONSOLE}

uses
  SysUtils, SynGDIPlus, Classes;

var
  Buffer: TMemoryStream;
begin
  Gdip.RegisterPictures;
  with TSynPicture.Create do try
    LoadFromFile('thumb.jpg');
    Buffer := TMemoryStream.Create;
    try
      if SaveAs(Buffer, gptTIF, Ord(evCompressionLZW)) = stOk then
        Buffer.SaveToFile('thumb.tiff');
    finally
      Buffer.Free;
    end;
  finally
    Free;
  end;
end.



XE8, к сожалению, нету. SynGDIPlus.pas версии 1.18.
...
Рейтинг: 0 / 0
03.11.2017, 13:39:25
    #39547401
Vladimir1212
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить TBitMap в файл типа TIFF
В общем, вот простейший пример использования SynGDIplus. Если в Delphi выполнить компиляцию под Win32 - отлично работает: читает из файла Bmp, записывает в файл Tif. Но мне надо весь проект компилировать под Win64!! Вот тут происходит затык: Access Violation
Код: 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.
unit Unit4;

interface

uses Winapi.Windows, Winapi.Messages, System.SysUtils,
  System.Variants,  System.Classes, Vcl.Graphics,  SynGDIplus,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type TForm4 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  end;

var Form4: TForm4;

implementation
{$R *.dfm}

procedure TForm4.Button1Click(Sender: TObject);
var Bmp: TBitmap;
begin
Gdip := TGDIPlusFull.Create('gdiplus.dll');
Bmp := TBitmap.Create;
Bmp.LoadFromFile('d:\Graphic01.bmp');
SynGDIPlus.SaveAs(Bmp, 'd:\test.tif', gptTIF);
Bmp.Free;   FreeAndNil(GdiP);
end;

end.


На этом зашёл в тупик...
...
Рейтинг: 0 / 0
03.11.2017, 13:39:55
    #39547402
Соколинский Борис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить TBitMap в файл типа TIFF
Нашел у себя пример записи в png, с tiff должно быть аналогично
Код: 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.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
var
  pngCLSID: TGUID;
  GP: TGPBitmap;
  PDatIn, PDatOut: parBGRX;
  LData: BitmapData;

.....
      GetEncoderClsid('image/png',pngCLSID);
      with TBitmap.Create do
      try
         Width:=Settings.GMapStdWidth;
         Height:=Settings.GMapStdHeight;
         PixelFormat:=pf32bit;  //+прозрачность

        Canvas.Brush.Color:=clWhite;
        Canvas.FillRect(Bounds(0,0,width,height));

        //тут рисуем на канве битмапа


        GP:=TGPBitmap.Create(width,height, PixelFormat32bppARGB);
        try
           GP.LockBits(MakeRect(0,0,width, height),
                            ImageLockModeRead or ImageLockModeWrite,
                            PixelFormat32bppARGB, LData);

            try
              for j:=0 to Height-1 do begin
                PDatIn:=ScanLine[j];
                PDatOut:=Pointer(cardinal(LData.Scan0)+J*Width*4);
                for k:=0 to Width-1 do begin
                  PDatOut[k]:=PDatin[k];
                  PDatOut[k][3]:=255-PDatOut[k][1]; //перекодировка прозрачности
               end;
              end;
            finally
              GP.UnlockBits(LData);
            end;

            GP.Save('temp.png', pngCLSID,nil);
          finally
            GP.Free;
          end;
        finally
          Free;
        end;
      end;
...
Рейтинг: 0 / 0
03.11.2017, 13:43:19
    #39547404
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить TBitMap в файл типа TIFF
SynGdiPlus качал отсюда.
...
Рейтинг: 0 / 0
03.11.2017, 13:50:50
    #39547408
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить TBitMap в файл типа TIFF
Vladimir1212,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
procedure TForm4.Button1Click(Sender: TObject);
var 
  Bmp: TBitmap;
begin
  Gdip.RegisterPictures; // - инициализация SynGDIPlus
  Bmp := TBitmap.Create;
  try
    Bmp.LoadFromFile('d:\Graphic01.bmp');
    SynGDIPlus.SaveAs(Bmp, 'd:\test.tif', gptTIF);
  finally
    Bmp.Free;   
  end;
end;
...
Рейтинг: 0 / 0
03.11.2017, 13:58:47
    #39547413
Dunkin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить TBitMap в файл типа TIFF
Чем не устраивает TWICImage для GDI+, который есть в Delphi, начиная с версии XE (или 2010)?
...
Рейтинг: 0 / 0
03.11.2017, 14:02:00
    #39547415
Vladimir1212
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить TBitMap в файл типа TIFF
Alekcyp, Так пробовал и в Вашем варианте примера!! Отлично идёт в Delphi XE8 при компиляции под Win32. И тоже затыкается при компиляции под Win64 .
Соколинский Борис, А вот как переделать пример с Png на Tiff - не понял??
...
Рейтинг: 0 / 0
03.11.2017, 14:03:55
    #39547416
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить TBitMap в файл типа TIFF
Vladimir1212, вы уверены что затыкается именно на GP? Если в режиме отладки запустить что там в CallStack'e?
...
Рейтинг: 0 / 0
03.11.2017, 14:13:37
    #39547428
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить TBitMap в файл типа TIFF
DunkinЧем не устраивает TWICImage для GDI+, который есть в Delphi, начиная с версии XE (или 2010)?
На XE2 он вылетает ещё на попытке загрузить Bmp.
...
Рейтинг: 0 / 0
03.11.2017, 14:14:44
    #39547431
Соколинский Борис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить TBitMap в файл типа TIFF
Vladimir1212А вот как переделать пример с Png на Tiff - не понял?? Вероятно, так
Код: pascal
1.
GetEncoderClsid('image/tiff',tiffCLSID);


Если нужно задать параметры (алгоритм сжатия и т.п.) смотри пример из стандартной демки по GDI+
"Determining the Parameters Supported by an Encoder" и доки к нему.
...
Рейтинг: 0 / 0
03.11.2017, 14:17:46
    #39547435
Vladimir1212
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить TBitMap в файл типа TIFF
Код: 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.
31.
unit Unit4;

interface

uses Winapi.Windows, Winapi.Messages, System.SysUtils,
  System.Variants,  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type TForm4 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  end;

var Form4: TForm4;

implementation
{$R *.dfm}

procedure TForm4.Button1Click(Sender: TObject);
begin
   With TWICImage.Create do try
   ImageFormat := wifBmp;
   LoadFromFile('d:\Graphic01.bmp');
   ImageFormat := wifTiff;
   SaveToFile('d:\Graphic01.tif');
   finally
   Free;
   end;
end;

end.


Упссс!! Просто и понятно: TWICImage работает и при компиляции под Win64. И не надо тащить SynGDIplus.
СПАСИБО!!
...
Рейтинг: 0 / 0
03.11.2017, 18:06:57
    #39547601
Vladimir1212
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить TBitMap в файл типа TIFF
Попутно заметил, что с помощью TWICImage так же просто можно загрузить в Bitmap файлы типа Jpeg или Tiff :
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
....
var MapBitmap: Graphics.TBitmap;   MapFileName: TFileName;
....
var Ext1: String;    MyWICImage: TWICImage;   MyJPEG, MyTIFF: Boolean;
....
MapBitmap.Free;   MapBitmap := Graphics.TBitmap.Create;
Ext1 := LowerCase(ExtractFileExt(MapFileName));
//++++++ Загрузка карты из файла типа TIFF добавлена 03.11.17 +++++++++
MyJPEG := (Ext1 = '.jpg') or (Ext1 = '.jpeg');
MyTIFF := (Ext1 = '.tif') or (Ext1 = '.tiff');
   If MyJPEG or MyTIFF then try
   MyWICImage := TWICImage.Create;
   If MyJPEG then MyWICImage.ImageFormat := wifJpeg
    else MyWICImage.ImageFormat := wifTiff;
   MyWICImage.LoadFromFile(MapFileName);
   MyWICImage.ImageFormat := wifBMP;
   MapBitmap.Assign(MyWICImage);
   finally
   MyWICImage.Free;
   end else MapBitmap.LoadFromFile(MapFileName);
...
Рейтинг: 0 / 0
03.11.2017, 21:27:07
    #39547659
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить TBitMap в файл типа TIFF
Vladimir1212,

Форматирование - адищная жесть, как это читать вообще можно...
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как сохранить TBitMap в файл типа TIFF / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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