誰かアドバイスできるかしら。スキャンしたドキュメントを提供することを目的とした.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;
}
}