如何使用Delphi设置TIFF图像的DPI分辨率?

时间:2012-08-02 13:40:48

标签: delphi resolution tiff dpi

我使用此代码绘制图像并使用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分辨率。

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

2 个答案:

答案 0 :(得分: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;

请参阅this commit

答案 1 :(得分:0)

TWICImage类可以保存TIF文件的DPI信息,但乍看之下对此功能的访问并不明显。只需调用句柄的SetResolution函数。

tif := TWICImage.Create;
...
tif.Handle.SetResolution( DPI_X, DPI_Y);