1

誰かアドバイスできるかしら。スキャンしたドキュメントを提供することを目的とした.NET4WCFサービスを作成しましたが、Delphi7コンシューマーを機能させるのに苦労しています。

.NET側では、次のコードを使用して、画像をビットマップに変換し、次にバイトの配列に変換しています。

        using (Bitmap img = new Bitmap(fileName))
        {
            ImageConverter converter = new ImageConverter();
            _bytes = (byte[])converter.ConvertTo(img, typeof(byte[]));
        }

コンシューマー側では、ByteArrayをTImage.Pictureに読み込みたいのですが、これが計画の基礎となった場所です。'LoadFromStream'行の次のコードエラー

EInvalidGraphic withmessage'ビットマップイメージが無効です'

procedure TBarcodeImageForm.FetchFile;
var
  bytes : TByteDynArray;
  info  : TDocInfo;
  Stream : TMemoryStream;
  bmp : TBitMap;
begin
  info := TDocInfo(FDocList.Items[lbFIles.ItemIndex]);
  bytes := FDocButton.FetchDocument(info.FilePath).Data;
  stream := TMemoryStream.Create();
  try
    Stream.Write(bytes[0], Length(Bytes));
    Stream.Position := 0;
    bmp := TBitMap.Create;
    bmp.LoadFromStream(stream);
  finally
    Stream.Free;
  end; 
end;

上記のメモリストリームの代わりにTFileStreamを使用することで、データが有効であることを示しました。つまり、結果をMSPaintに読み込むことができます。私は次のステップで立ち往生していることを認めなければなりません:Delphi 7は時代遅れで、最新のビットマップを処理できませんか?サーバー側のファイルがtiffとjpgに関連しているという事実は関係がありますか?次に何をすればいいですか?

どんなアドバイスもありがたく受けました。

アップデート - - - - - - - - - -

JPGが渡されるようにコードを変更しましたが、結果は非常に似ています。今回は、クライアント側で画像をロードしようとすると、JPEGエラー#53が発生します。TFileStreamを使用してディスクに保存すると、結果のファイルはWindows Picture Viewerで正常に表示されますが、それでもTImageコンポーネントに読み込まれません。

クライアント側は次のようになります

  stream := TFileStream.Create('c:\temp.jpg', fmCreate);
  try
    Stream.Write(bytes[0], Length(Bytes));
    Stream.Position := 0;
  finally
    Stream.Free;
  end;

  try
    imgDocument.Picture.LoadFromFile('c:\temp.jpg');
  except end;

サーバー側(今回はデータコントラクト全体を公開する場合に備えて)

    [DataContract]
public class ImageData
{
    private byte[] _bytes;

    [DataMember]
    public byte[] Data
    {
        get { return _bytes; }
        set { _bytes = value; }
    }

    public ImageData(string fileName)
    {
        using (MemoryStream memStream = new MemoryStream())
        {
            using (Image img = Image.FromFile(fileName))
            {
                img.Save(memStream, ImageFormat.Jpeg);
            }
            _bytes = new Byte[memStream.Length];
            int i = 0;
            while (i < memStream.Length)
                i += memStream.Read(_bytes, i, 128000);
        }
    }
}

アップデート - - - - - - - - - - - - - - - - - - - - - - - - - --------------------------------

Winformsコンシューマーからのサービスのテストに成功した場合、次のコードを使用しました。

if (docList != null)
{
    using (MemoryStream memStream = 
        new MemoryStream(client.FetchDocument(docList.Items[0].FilePath).Data))
    {
        System.Drawing.Image img = Image.FromStream(memStream); 
        pictureBox1.Image = img; 
    }
}   
4

3 に答える 3

1

サーバーとクライアントの間のデータのマーシャリングとシリアル化のプロセスを処理するために WCF を取得している印象を受けます (両方ともツールによって自動生成されますか?)。これを読み取ることができるクライアントを Delphi 7 で作成します。

困難な戦いに直面していることを警告しますが、WCF が SOAP メッセージを使用している場合は、WCF サービスのメッセージを消費する SOAP クライアントを Delphi で作成できるはずなので、チャンスがあります。

画像自体については、どのように連載されているかわかりません。しかし、一度知ってしまえば簡単なはずです。WCF が単に System.Drawing.Bitmap をシリアル化するのではなく、ディスク上のビットマップ ファイルの未加工のバイトを転送していると仮定すると、準備は完了です。WCF メッセージのバイトをディスクまたはメモリ内バッファーにダンプして開くだけです。それらを TBitmap で。

于 2012-08-11T01:31:03.947 に答える
1

申し訳ありませんが、これはニシンであることが判明しました。問題は、私が提供していた画像がそもそも有効ではなかったことです。必要だったのは、サードパーティ ベンダーに電話するだけでした。

プラス面としては、提供したコード サンプルが基本的に適切であることを意味します。

于 2012-08-16T17:40:57.690 に答える
1

ビットマップ画像をそのまま使用しても問題ない場合を除き、(JPEG ユニットから) TJPegImage を介してストリームから画像を読み込んでみることをお勧めします。私はあなたが試みていることと似たようなことをしていますが、AtoZedの「CrossTalk」製品を介して.Netイメージングライブラリの周りの.Net 4ラッパーから直接画像バイトを取得しています.

最初に、境界を越えて渡された .Net MemoryStream オブジェクトを Delphi のバイト配列に変換する必要があります。次に、それを Delphi TMemoryStream にロードし、TJpegImage に取り込みます。

(私は最初、LoadfromFile がファイル名に基づいてロードが行われる方法を明らかに調整していると判断するまで、あなたと同じ問題を抱えていました。それに基づいて、試してみる代わりに、JPegs、Tiffs などの適切な画像バリアントを明示的に作成しました。ジェネリック TImage としてロードします。)

返される画像が JPEG の場合、これは Delphi7 で機能します。

  dJpegImage: TJpegImage;
  imageMemoryStream: MemoryStream;
  pictureBoxImageOutput: TImage;
  lengthImageByteArray: Integer;   // already set before this fragment based on the .Net Image info
  imageDelphiByteArray: array of byte;
  ...
  ...
  imageStream := TMemoryStream.Create();
  imageStream.WriteBuffer(imageDelphiByteArray[0], lengthImageByteArray);
  imageStream.Position := 0;
  dJpegImage := TJPEGImage.Create;
  dJpegImage.LoadFromStream(imageStream);
  pictureBoxImageOutput.Picture.Graphic := dJpegImage;
于 2012-08-17T18:09:53.640 に答える