3

このコードを使用して、WIA からスキャンした画像を取得しています。

const
  wiaFormatJPEG = '{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}';
  wiaFormatPNG = '{B96B3CAF-0728-11D3-9D7B-0000F81EF32E}';
var
  CommonDialog: ICommonDialog;
  AImage: IImageFile;
  i: Integer;
begin
  CommonDialog := CreateOleObject('WIA.CommonDialog') as ICommonDialog;

  for i := 1 to Scanner.Properties.Count do
  begin
    if (Scanner.Properties[i].Name = 'Horizontal Resolution') or
      (Scanner.Properties[i].Name = 'Vertical Resolution') then
      Scanner.Properties[i].Set_Value(72)
    else if Scanner.Properties[i].Name = 'Horizontal Extent' then
      Scanner.Properties[i].Set_Value(Round(8.27 * 72))
    else if Scanner.Properties[i].Name = 'Vertical Extent' then
      Scanner.Properties[i].Set_Value(Round(11.00 * 72));
  end;
  AImage := IUnknown(CommonDialog.ShowTransfer(Scanner, wiaFormatPNG, True)) as IImageFile;
  //Save the image
  AImage.SaveFile('D:\1.' + AImage.FileExtension);
  imgImage.Picture.LoadFromFile('D:\1.' + AImage.FileExtension);
  DeleteFile('D:\1.' + AImage.FileExtension);
end;

Scanner次のコードを使用して初期化されます。

Scanner := DevMgr.DeviceInfos[Integer(cbWIASource.Items.Objects[cbWIASource.ItemIndex])].Connect.Items[1];

とはDevMgrcbWIASource次のコードを使用して初期化されます。

DevMgr := CreateOleObject('WIA.DeviceManager') as IDeviceManager;
for i := 1 to DevMgr.DeviceInfos.Count do
    for j := 1 to DevMgr.DeviceInfos[i].Properties.Count do
      if DevMgr.DeviceInfos[i].Properties[j].Name = 'Name' then
      begin
        cbWIASource.Items.AddObject(DevMgr.DeviceInfos[i].Properties[j].Get_Value, TObject(i));
        Break;
      end;

最初にディスクに保存せずに、スキャンしたドキュメントをコピーする方法があるかどうか疑問に思っていました。ARGBDataのメンバーにアクセスしてピクセル データにアクセスできることを MSDN で読みましたImageFileが、画像全体を から にコピーする簡単な方法はありFileDataますTBitmapか? たとえば、 ? を使用できますTMemoryStreamか?


更新として、MSDNでこの例を見つけました。私は VB について何も知りませんが、Pictureオブジェクトは のラッパーだと思いますHBITMAPImageFile.Pictureでは、プロパティが必要なものであると結論付けるのは論理的ですか?

4

1 に答える 1

1

IImageFile には、 IVector.BinaryDataを介してバイナリ イメージ データへのアクセスを提供するプロパティ FileData があります。

于 2012-10-29T22:38:23.283 に答える