1

我使用此代码绘制图像并使用 Delphi 2006 将其保存为 TIFF:

var Bmp: TBitmap;
  MF: TMetaFile;
  MetafileCanvas: TMetafileCanvas;
begin
  Gdip := TGDIPlusFull.Create('gdiplus.dll');
  MF := TMetaFile.Create;

  MF.Width := 1000;
  MF.Height := 1100;

  MetafileCanvas := TMetafileCanvas.Create(MF, 0);
  MetafileCanvas.Brush.Color := clRed;
  MetafileCanvas.Brush.Style := bsDiagCross;
  MetafileCanvas.Ellipse(50, 50, 300 - 50, 200 - 50);
  MetafileCanvas.Free;

  Bmp := Gdip.DrawAntiAliased(MF);

  Image1.Picture.Assign(Bmp);
  SynGDIPlus.SaveAs(Bmp, 'c:\test.tif', gptTIF); 
  Bmp.Free;

  MF.Free;
  FreeAndNil(GdiP);
end;

注意我使用来自 http://www.synopse.info 的免费框架。

该代码运行良好。但是我有一个问题。如何设置 TIFF 分辨率。我的 test.tif 图像有 96 DPI(屏幕分辨率),但我需要 200 DPI。注意我不能改变图像尺寸(宽度和高度),因为正确,我只想改变 DPI 分辨率。

我找到了很多关于这个问题的答案,但没有找到关于 Delphi 的答案。

4

2 回答 2

3

我添加了以下方法:

procedure TSynPicture.BitmapSetResolution(DPI: single);
begin
  if (fImage<>0) and fAssignedFromBitmap and (DPI<>0) then
    Gdip.BitmapSetResolution(fImage,DPI,DPI);
end;

它将调用相应的 GDI+ API 来设置位图分辨率。

那么保存时要指定:

procedure SaveAs(Graphic: TPersistent; const FileName: TFileName;
  Format: TGDIPPictureType; CompressionQuality: integer=80;
  MaxPixelsForBiggestSide: cardinal=0; BitmapSetResolution: single=0); overload;
var Stream: TStream;
begin
  Stream := TFileStream.Create(Filename, fmCreate);
  try
    SaveAs(Graphic,Stream,Format,CompressionQuality,MaxPixelsForBiggestSide,
      BitmapSetResolution);
  finally
    Stream.Free;
  end;
end;

所以你可以在你的代码中编写:

  Bmp := Gdip.DrawAntiAliased(MF);
  Image1.Picture.Assign(Bmp);
  SynGDIPlus.SaveAs(Bmp, 'c:\test.tif', gptTIF, 80, 0, 200); // force 200 DPI
  Bmp.Free;

请参阅此提交

于 2012-08-02T15:42:01.850 回答
1

TWICImage 类能够保存 TIF 文件的 DPI 信息,但乍一看并不明显。只需调用Handle 的SetResolution 函数即可。

tif := TWICImage.Create;
...
tif.Handle.SetResolution( DPI_X, DPI_Y);
于 2017-02-09T21:11:53.270 回答