none
把 PictureBox所畫的東西轉成Byte() RRS feed

  • 問題

  • 我在Form上開了一個PictureBox,

    我該如何把畫在上面的東西轉成Byte之後存入Oracle的BLOB呢?

    2007年5月16日 上午 03:07

解答

  • 存入時,用 Image.Save 寫入 MemoryStream (ms) ,在用 ms.ToArray 轉成 Byte()。

    讀出 Byte() 後,用 New ms(Byte()) 建立新個體,再由 Image.FromStream(ms) 拉出來。

     

    一般點、線等區塊圖建議 Save 到 ms 時,用 png 格式轉換。

     

    你可以先搜尋既有討論,關鍵字:Image MemoryStream

    2007年5月16日 上午 03:14
    版主

所有回覆

  • 存入時,用 Image.Save 寫入 MemoryStream (ms) ,在用 ms.ToArray 轉成 Byte()。

    讀出 Byte() 後,用 New ms(Byte()) 建立新個體,再由 Image.FromStream(ms) 拉出來。

     

    一般點、線等區塊圖建議 Save 到 ms 時,用 png 格式轉換。

     

    你可以先搜尋既有討論,關鍵字:Image MemoryStream

    2007年5月16日 上午 03:14
    版主
  • 呃~,不太懂耶~

    在宣告一個memoryStream後,

    Dim mem as memorystream

     

    存入時picturebox1.image.save(1,2,3)

    裡面的參數無法以mem帶入1,第1個參數不是只能帶入路徑檔名嗎?

    2007年5月16日 上午 04:36
  • 1. 你要 "建" 一個 MemoryStream,而不是 "宣告" 一個 MemoryStream... 

    Code Snippet
    Dim mem As MemoryStream = New MemoryStream()

     

    2. Image.Save 是多載方法:

     

    Name Description
    Image.Save (String) Saves this Image to the specified file or stream.
    Image.Save (Stream, ImageFormat) Saves this image to the specified stream in the specified format.

    Supported by the .NET Compact Framework.

    Image.Save (String, ImageFormat) Saves this Image to the specified file in the specified format.

    Supported by the .NET Compact Framework.

    Image.Save (Stream, ImageCodecInfo, EncoderParameters) Saves this image to the specified stream, with the specified encoder and image encoder parameters.
    Image.Save (String, ImageCodecInfo, EncoderParameters) Saves this Image to the specified file, with the specified encoder and image-encoder parameters.

    2007年5月16日 上午 04:43
    版主
  •             Dim sStrsql As String
                Dim Cmd_SQL As New OracleCommand
                Dim mem As New MemoryStream()
                Dim myBitmap As New Bitmap(Me.picBase.Image)   <--Form上的PictureBox名稱為picbase

     

                myBitmap.Save(mem, System.Drawing.Imaging.ImageFormat.Bmp)<--    將picbase.image存入記憶體中

     

                Dim Buf(CInt(mem.Length - 1)) As Byte  <--宣告一個byte型態的陣列

     

                sStrsql = ""
                sStrsql = sStrsql & "Insert into wip_pic_test(picname,pic) values('" & strFile & "',@Pic)"

                mem.Position = 0
                mem.Read(Buf, 0, CInt(mem.Length))  <--讀取記憶體
                mem.Close()

     

                Dim prm As New OracleParameter("@Pic", OracleType.Blob, Buf.Length, ParameterDirection.Input, False, 0, 0, Nothing, DataRowVersion.Current, Buf)  <--將SQL語法中的@Pic帶入型態為BLOB的陣列值


                Cmd_SQL.Parameters.Add(prm)

                Cmd_SQL.CommandType = CommandType.Text
                Cmd_SQL.CommandText = sStrsql

     

    最後直行Insert後Oracle卻回覆「變數名稱?號碼無效」的錯誤,我可以看到帶入@Pic之後的SQL語法嗎?

    2007年5月16日 上午 07:48
  • 1. SQL 陳述式最好不要字串合併和參數合併使用,一來看起來很混亂,二來也不安全。

    2. 輸出 byte[] 只要用一個 MemoryStream.ToArray() 就夠了,不必那麼大費周章。

    3. SQL 指令必須在設定參數前指定給 Command。

    2007年5月16日 上午 08:26
    版主
  • 我把原先的程式改成

     

                Dim Buf(CInt(mem.Length - 1)) As Byte

                'mem.Position = 0
                'mem.Read(Buf, 0, CInt(mem.Length))
                'mem.Close()

     

                Buf = mem.ToArray

     

                sStrsql = ""
                sStrsql = sStrsql & "Insert into wip_pic_test(picname,pic) values('" & strFile & "',@Pic)"

     

                Cmd_SQL.CommandType = CommandType.Text
                Cmd_SQL.CommandText = sStrsql

     

                Dim prm As New OracleParameter("@Pic", OracleType.Blob, Buf.Length, ParameterDirection.Input, False, 0, 0, Nothing, DataRowVersion.Current, Buf)


                Cmd_SQL.Parameters.Add(prm)

     

    還是出現一樣的錯誤耶~

     

     

    而且若Insert BLOB 的SQL語法若不以參數合併來寫,什麼方法可以將Byte寫入SQL 語法呢?

    2007年5月16日 上午 08:36
  • 以下程式在 SQL Server 可以用: 

    Code Snippet

    Dim Cmd_SQL As SqlCommand = New SqlCommand()

    Dim Buf() As Byte = mem.ToArray()

    Dim sStrsql = "Insert into wip_pic_test (picname, pic) values (@filename, @Pic)"

     

    Cmd_SQL.Connection = conn

    Cmd_SQL.CommandType = CommandType.Text
     Cmd_SQL.CommandText = sStrsql

     

    Dim prmPic As New SqlParameter("@Pic", SqlDbType.Image, Buf.Length)

    Dim prmFileName As New SqlParameter("@filename", SqlDbType.Nvarchar, 50)

     

    prmPic.Value = Buf

    prmFileName.Value = strFile

     

    Cmd_SQL.Parameters.Add(prmPic)

    Cmd_SQL.Parameters.Add(prmFileName)

     

    conn.Open()

    Cmd_SQL.ExecuteNonQuery()

    conn.Close()

     

    在 Oracle 我就不知道是什麼原因了,也許和 "變數命名" 有關吧,像 MySQL 的變數就不能用 "@",要用 "?" 開頭。

     

    2007年5月16日 上午 08:45
    版主
  • 還是一樣出現「變數名稱?號碼無效的錯誤」
    2007年5月16日 上午 09:04
  • Oracle 我不熟,所以無法精確找出原因。

    但你可以看一看 Oracle Technology Network 的文件:

    http://www.oracle.com/technology/sample_code/tech/windows/odpnet/odpbasic.html

     

    有一個 sample 是 BLOB 的,但你要先安裝,引用 Oracle Data Provider for .NET 才可以。

     

    這裡還有一份文件:

    http://www.oracle.com/technology/sample_code/tech/windows/odpnet/howto/anonyblock/index.html

    2007年5月16日 上午 10:58
    版主