3

我正在使用 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 扩展名)。

我错过了什么?

4

2 回答 2

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);
  (...)

它将EncoderCompression为 TIFF 图片添加参数,这似乎是必需的。

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

于 2011-07-08T06:11:22.200 回答
0

在 Delphi 中保存 TIFF 文件很困难。我不知道有任何免费/开源模块可以做到这一点。

ImageEn有效。

过去,我使用命令行“i_view32.exe c:\temp\scanned.bmp /bpp=1 /convert=c:\temp\scanned.tif”通过 irfanview 使用 irfanview 保存为 bmp 并转换为 tiff

于 2011-07-07T22:11:17.227 回答