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;

結果: 画像は 96 dpi のままで、BMP として保存されました (TIF 拡張子を使用しても)。

私は何が欠けていますか?

4

2 に答える 2

1

GDI+ ライブラリは tiff 画像を保存できます。

SynGdiPlus ユニットは、TIFF エンコーダーに {557CF405-1A04-11D3-9A73-0000F81EF32E} を使用します。

TSynPicture.SaveAsコードから、 2 つの可能性が見えます。

  • 対応する 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);
  (...)

必須と思われるEncoderCompressionTIFF 画像用のパラメータを追加します。

この修正を含むようにソース コード リポジトリのバージョンを更新しました。

于 2011-07-08T06:11:22.200 に答える
0

Delphi で TIFF ファイルを保存するのは困難です。これを行う無料/オープンソースのモジュールは知りません。

ImageEnが動作します。

過去に、コマンドライン 'i_view32.exe c:\temp\scanned.bmp /bpp=1 /convert=c:\temp\scanned.tif' を使用して createprocess を介して irfanview で bmp として保存し、tiff に変換することを使用しました。

于 2011-07-07T22:11:17.227 に答える