如何使用Delphi扫描300dpi图像并以TIFF格式保存?

时间:2011-07-07 19:18:28

标签: delphi gdi+ twain

我正在使用Delphitwain(delphitwain.sourceforge.net)向我的应用添加扫描功能。扫描工作正常,我可以保存bmp和jpeg文件。现在我需要:

  • 以300dpi保存(扫描仪有能力)
  • 以TIFF格式保存

在挖掘之后,我找到了2个提示:

http://www.delphipraxis.net/132787-farbstich-nach-bitmap-operation.html

http://synopse.info/fossil/wiki?name=GDI%2B

这是我的最终代码:

procedure TForm1.GoAcquireClick(Sender: TObject);
begin
  Counter := 0;
  Twain.SourceManagerLoaded := TRUE;
  Twain.LoadSourceManager;
  Twain.TransferMode := ttmMemory;

  with Twain.Source[ 0 ] do
  begin
    Loaded := TRUE;
    SetIXResolution(300);
    SetIYResolution(300);
    SetIBitDepth(1);
    EnableSource(true, true);
    while Enabled do Application.ProcessMessages;
  end;
end;

procedure TForm1.TwainTwainAcquire(Sender: TObject; const Index: Integer;
   Image: TBitmap; var Cancel: Boolean);
var
   TiffHolder: TSynPicture;
begin
  Inc( Counter );
  Current := Counter;
  ImageHolder.Picture.Assign( Image );
  ImageHolder.Picture.Bitmap.Monochrome := true;
  ImageHolder.Picture.Bitmap.Pixelformat := pf1Bit;

  SynGDIPlus.SaveAs(ImageHolder.Picture, format('c:\temp\teste%d.tif',[ Counter ]), gptTIF );
end;

结果:图像仍然是96dpi并保存为BMP(即使使用TIF扩展名)。

我错过了什么?

2 个答案:

答案 0 :(得分:1)

GDI +库可以保存tiff图片。

SynGdiPlus装置使用{557CF405-1A04-11D3-9A73-0000F81EF32E}作为其TIFF编码器。

TSynPicture.SaveAs代码中,我看到了两种可能性:

  • 您没有安装相应的TIFF编码器;
  • TIFF编码器需要一些缺少的参数。

试试这个版本:

type
  /// the optional TIFF compression levels
  // - use e.g. ord(evCompressionCCITT4) to save a TIFF picture as CCITT4
  TGDIPPEncoderValue = (
    evColorTypeCMYK,
    evColorTypeYCCK,
    evCompressionLZW,
    evCompressionCCITT3,
    evCompressionCCITT4,
    evCompressionRle,
    evCompressionNone,
    (...)
    evFrameDimensionPage);

const
  EncoderCompression: TGUID = '{e09d739d-ccd4-44ee-8eba-3fbf8be4fc58}';

function TSynPicture.SaveAs(Stream: TStream; Format: TGDIPPictureType;
  CompressionQuality: integer): TGdipStatus;
var fStream: IStream;
    Len,Dummy: Int64;
    tmp: pointer;
    Params: TEncoderParameters;
    PParams: pointer;
    MS: TMemoryStream absolute Stream;
begin
  if not Gdip.Exists or (Stream=nil) or (fImage=0) then begin
    result := stInvalidParameter;
    exit;
  end;
  Params.Count := 1;
  Params.Parameter[0].Type_ := EncoderParameterValueTypeLong;
  Params.Parameter[0].NumberOfValues := 1;
  Params.Parameter[0].Value := @CompressionQuality;
  PParams := nil;
  case Format of
  gptJPG: if CompressionQuality>=0 then begin
    Params.Parameter[0].Guid := EncoderQuality;
    PParams := @Params;
  end;
  gptTIF: begin
    if not (TGDIPPEncoderValue(CompressionQuality) in [
        evCompressionLZW, evCompressionCCITT3, evCompressionCCITT4,
        evCompressionRle, evCompressionNone]) then
      // default tiff compression is LZW
      CompressionQuality := ord(evCompressionLZW);
    Params.Parameter[0].Guid := EncoderCompression;
    PParams := @Params;
  end;
  end;
  CreateStreamOnHGlobal(0, true, fStream);
  (...)

它会为TIFF图片添加EncoderCompression参数,seems to be required

我已更新源代码存储库版本以包含此更正。

答案 1 :(得分:0)

在Delphi中保存TIFF文件很难。我不知道这样做的任何免费/开源模块。

ImageEn有效。

过去我使用save作为bmp并使用命令行通过createprocess将irfanview转换为tiff 'i_view32.exe c:\ temp \ scanning.bmp / bpp = 1 /convert=c:\temp\scanned.tif'