2012-08-11 19 views
1

我想知道是否有人可以建議。我已經編寫了一個.NET 4 WCF服務,該服務旨在爲掃描的文檔提供服務,並努力讓Delphi 7使用者工作。將圖像從.NET傳輸到Delphi

在.NET方面,我將圖像轉換爲位圖,然後用下面的代碼字節數組:

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

在消費者方面我想讀ByteArray傳遞到TImage.Picture這這個計劃已經失敗了。與

EInvalidGraphic與消息的「LoadFromStream」線下面的代碼的錯誤「的位圖圖像是無效」

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相關?接下來我應該做什麼?

任何建議感激地收到。

UPDATE -------------------

我改變了代碼,使一個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); 
     } 
    } 
} 

UPDATE ----------- -------------------------------------------------- ----

對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; 
    } 
} 
+0

它總是幫助張貼問題實際上是什麼。如果基於代碼,然後顯示你有什麼。如果以設計爲基礎,告訴我們你在想什麼。 – NotMe 2012-08-11 01:19:22

+0

對不起,我早在我準備好之前就提出了這個問題 – 2012-08-11 01:37:33

+0

@Ken White - 是的道歉 – 2012-08-11 01:44:50

回答

1

除非您可以繼續使用位圖圖像,否則您可能想嘗試通過TJPegImage(不在JPeg單元中)從流中讀取圖像。我正在做類似於您嘗試的操作,但是通過AtoZed的「CrossTalk」產品從.Net圖像庫中的.Net 4包裝器直接獲取圖像字節。

所以首先,我必須將通過邊界傳遞的.Net MemoryStream對象轉換爲Delphi的字節數組。然後我將它加載到Delphi TMemoryStream中並將它帶入TJpegImage。

(我起初有同樣的問題,直到我確定LoadfromFile顯然是根據文件名定製加載的方式,基於此,我明確地爲JPegs,Tiffs等創建了適當的圖像變體。返回的圖像時,而不是試圖將其加載爲一個通用的TImage)

這對我的作品與Delphi7的是JPEG:

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; 
+0

非常感謝 - 這幾乎是客戶端現在的樣子 - 顯然不會碰到磁盤客戶端。 – 2012-08-20 18:57:35

1

我讓你得到WCF照顧編組的過程和連載數據的服務器和客戶端之間(均由工具爲你自動生成的?)的印象,你不」實際上對「在線」格式有很大的控制權,現在你想在Delphi 7中編寫一個可以讀取它的客戶端。

我會提醒你,你正處於艱苦的鬥爭中,但是如果你的WCF使用SOAP消息,那麼你就有機會在Delphi中編寫一個使用你的WCF的SOAP客戶端服務的消息。

至於圖片本身,我不知道它們是如何序列化的。但一旦你發現它應該很容易。假設WCF不是簡單地序列化一個System.Drawing.Bitmap,而是將一個位圖文件的原始字節傳輸到磁盤上,那麼你就全部設置好了:只需將WCF消息的字節轉儲到磁盤或內存緩衝區並打開他們與TBitmap。

+0

我非常謹慎地指定數據合約 - 'fetchFile'方法返回一個字節數組。我有我所有的其他方法甜蜜地工作。在Delphi方面,我依靠wsdlImp來創建界面,但我確信收到的數據是預期的 - 就像我在文章中所說的 - 如果我將接收到的流保存到文件中,它就是一個非常好的圖形。 – 2012-08-11 01:43:12

+0

你的第三段幾乎總結了我的問題 - 它應該是直截了當的,但它不起作用。是的,我正在使用SOAP。 – 2012-08-11 01:48:32

+0

問題不在Delphi中支持位圖,它是WCF-to-Delphi-SOAP-RTL阻抗不匹配。 Delphi的SOAP RTL不能無縫地處理所有可能的WCF API簽名(你稱之爲數據契約)。我希望如何。 – 2012-08-12 13:48:45

1

對不起,大家 - 這原來是一個紅鯡魚。問題在於我所服務的圖像首先是無效的。快速「打電話給第三方供應商是所有必要的。

從正面來看,這意味着我提供的代碼樣本基本上是完好的。