我想知道是否有人可以建议。我编写了一个 .NET 4 WCF 服务,该服务旨在为扫描的文档提供服务,并且正在努力让 Delphi 7 消费者工作。
在 .NET 方面,我使用以下代码将图像转换为位图,然后转换为字节数组:
using (Bitmap img = new Bitmap(fileName))
{
ImageConverter converter = new ImageConverter();
_bytes = (byte[])converter.ConvertTo(img, typeof(byte[]));
}
在消费者方面,我想将 ByteArray 读入 TImage.Picture ,这就是计划失败的地方。“LoadFromStream”行中的以下代码错误
带有消息“位图图像无效”的 EInvalidGraphic
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 是否过于过时而无法处理现代位图?服务器端的文件与 tiffs 和 jpgs 相关吗?接下来我该怎么办?
感激地收到任何建议。
更新 - - - - - - - - - -
我更改了代码,以便传递 JPG,结果非常相似。这次我在尝试加载图像客户端时收到 JPEG 错误 #53。如果我使用 TFileStream 并保存到磁盘,则生成的文件在 Windows 图片查看器中看起来不错,但仍不会加载到 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;
}
}