【发布时间】:2012-08-08 07:28:00
【问题描述】:
我想知道是否有人可以提供建议。我编写了一个 .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;
}
}
【问题讨论】:
-
发布问题的实际情况总是有帮助的。如果基于代码,则显示您所拥有的。如果基于设计,请告诉我们您的想法。
-
很抱歉,我还没准备好就提出了这个问题
-
这可能与您正在序列化位图(JPEG 或 TIFF)以外的内容有关。 Delphi 的
TBitmap需要一个有效的位图头。您可以尝试使用TJPegImage.LoadFromStream并测试获取 JPEG;如果这样可以解决问题,您可能还可以找到 D7 的 TIFF 组件;您必须从数组中读取前几个字节以确定您正在接收哪种类型的图像并创建适当的图形来处理它。 -
我不一定要使用 TBitMap,我只是假设它是最低公分母。实际扫描的文档可能有多种格式。我将尝试使用 jpeg,看看它们是否更可靠。关于为什么 MSPaint 可以读取输出但 TBitMap 不能的任何想法?
-
@Hugh - 可能。尽管您正在测试的查看器可能会容忍无效文件。使用您知道 D7 的 TImage 能够显示的图像程序(使用相同的格式,即 A8R8G8B8 等)重新保存其中一个文件,然后您可以通过区分标题来确定文件的问题。