2011-12-06 3 views
0

Silverlight4からCOMに画像を渡すときに助けが必要です。Silverlight - WritableBitmapイメージをCOMに渡してビットマップに変換する

WritableBitmapからByteArrayを渡してBitmapに変換しようとしています。

//In silverlight 4: 
public string func1() 
{ 
    WriteableBitmap bitmap = new WriteableBitmap((BitmapSource)imgTempCropped.Source); 
    byte[] imgbytes = ToByteArray(bitmap); 
    dynamic comClass = AutomationFactory.CreateObject("OCRLibrary.OCRClass"); 
    ocrText = comClass.Process(imgbytes); 
} 

//In COM: 
public string Process(byte []imgbytes) 
{ 
    Stream input = new MemoryStream(imgbytes); 

    try{ 
     Bitmap bitmap1 = new Bitmap(input); 
    }catch(Exception e) 
    { 
     return e.Message; 
    } 
} 

//エラーメッセージ: パラメータが無効です。

私もBase64Stringに渡してみましたが、同じエラーメッセージがスローされます:(

答えて

0

に私は最終的にSilverlightからビットマップをSilverlight COM Wrapperに渡す。

//In Silverlight: 

dynamic comClass = AutomationFactory.CreateObject("OCRLibrary.OCRClass"); 
WriteableBitmap bitmap = new WriteableBitmap((BitmapSource)imgTempCropped.Source); 
byte[] imgbytes = ToByteArrayOptimized(bitmap);          
ocrText = comClass.Process(imgbytes); 


//Found this for ImageTools: ImageTools.IO.Jpeg.JpegEncode 
//using ImageTools; 
//using ImageTools.Helpers; 
//using ImageTools.IO; 
//using ImageTools.IO.Bmp; 
//using ImageTools.IO.Png; 
//using ImageTools.IO.Jpeg; 
//I have yet to remove couple of using from here since I added all to test the code ;) 

    #region To byte array (optimized) 

    /// <summary> 
    /// Synchronously converts a bitmap to a byte array. 
    /// The used format can be JPEG or PNG, depending on which one 
    /// results in a smaller file size. 
    /// </summary> 
    /// <param name="bitmap">The bitmap to encode.</param> 
    /// <returns>The encoded image either in PNG or JPEG format.</returns> 
    public byte[] ToByteArrayOptimized(WriteableBitmap bitmap) 
    { 
     ExtendedImage image = bitmap.ToImage(); 

     // encode to jpeg 
     MemoryStream jpegStream = new MemoryStream(); 
     _jpegEncoder.Encode(image, jpegStream); 

     // encode to png 
     // MemoryStream pngStream = new MemoryStream(); 
     // _pngEncoder.Encode(image, pngStream); 

     // decide which one we should use 
     // MemoryStream formatToUse = jpegStream.Length < pngStream.Length ? jpegStream : pngStream; 
     MemoryStream formatToUse = jpegStream; 
     byte[] result = formatToUse.ToArray(); 

     // done 
     return result; 
    } 

    //In COM: 
    [ComVisible(true)] 
    //public string Process(string base64string) 
    public string Process(byte[] imgbytes) 
    { 
     MemoryStream mystream = new MemoryStream(imgbytes); 
     System.Drawing.Image p = System.Drawing.Image.FromStream(mystream); 
     Bitmap Img = new Bitmap(p);  // :) I got Bitmap here.  

    } 

http://www.pitorque.de/MisterGoodcat/post/Improving-the-image-upload-sample.aspx

0

COMは何ですか???

private void SaveToIsolatedStorage(Stream imageStream, string fileName, byte[] arr) 
     { 



      try 
      { 

       using (IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication()) 
       { 
        if (myIsolatedStorage.FileExists(fileName)) 
        { 
         myIsolatedStorage.DeleteFile(fileName); 
        } 
        myIsolatedStorage.CreateDirectory("Album"); 
        IsolatedStorageFileStream fileStream = myIsolatedStorage.CreateFile(fileName); 
        fileStream.Write(arr, 0, arr.Length); 
        fileStream.Close(); 
        return; 
        BitmapImage bitmap = new BitmapImage(); 
        bitmap.SetSource(imageStream); 

        WriteableBitmap wb = new WriteableBitmap(bitmap); 
        wb.SaveJpeg(fileStream, wb.PixelWidth, wb.PixelHeight, 0, 85); 
        fileStream.Close(); 

       } 
      } 
      catch (Exception ex) { } 

     } 

Stream uc = new MemoryStream(img); 


       SaveToIsolatedStorage(uc, tempJPEG, img); 
+0

こんにちはラエド、私はSilverlightとEmguCVでOCR Applicatinを構築しています。アプリケーションをオフラインモードで動作させたいので、COM WrapperにOCR関連のコードを追加しました。これにより、Silverlightの "Out of Browse"をSilverlightコードに埋め込むことができます:)。 – Kaps

0
check it 

public string func1() 
{ 
    WriteableBitmap bitmap = new WriteableBitmap((BitmapSource)imgTempCropped.Source); 
    byte[] imgbytes = ToByteArray(bitmap); 
    dynamic comClass = AutomationFactory.CreateObject("OCRLibrary.OCRClass"); 
    ocrText = comClass.Process(imgbytes); 
} 

//In COM: 
public string Process(byte []imgbytes) 
{ 
    Stream input = new MemoryStream(imgbytes); 
    input.Write(arr, 0, arr.Length); 
    input.Close(); 
    try{ 
     Bitmap bitmap1 = new Bitmap(input); 
    }catch(Exception e) 
    { 
     return e.Message; 
    } 
} 
+0

こんにちは、私は試みました: ストリーム入力=新しいMemoryStream(imgbytes); input.Write(imgbytes、0、imgbytes.Length); input.Close(); try { ビットマップbitmap1 =新しいビットマップ(入力)。 } catch(例外e) { return e.Message; } エラーメッセージは「クローズドストリームにアクセスできません」でした。だから私は、 "パラメータが有効ではない"として、閉じると新しいエラーメッセージを得たコメント。 – Kaps

関連する問題