none
MemoryStream 問題 RRS feed

  • 問題


  • 請問各位大大

    如何使用 MemoryStream 的方式讀取影像檔案

    並顯示於 PictureBox1.Image 上面

    2006年8月11日 上午 02:50

解答

  • HI,

    讀取影像檔案的內容並顯示到PictureBox控制項, 可以使用FileStream類別:

    Dim fs As FileStream= New FileStream("檔案名稱", FileMode.Open, FileAccess.Read)
    Dim bmp As Bitmap = New Bitmap(fs)
    PictureBox1.Image = bmp
    fs.Close()

    讀取記憶體中的影像內容並顯示到PictureBox控制項, 可以使用MemoryStream類別:

    Dim ms As MemoryStream= New MemoryStream(存放影像內容的byte陣列)
    Dim bmp As Bitmap = New Bitmap(ms)
    PictureBox1.Image = bmp
    ms.Close()

    tihs

    2006年8月11日 上午 05:40
  • 小象:

    就先前在舊討論區跟你討論的經驗,依你使用 VB6 的程度應該不會問這種問題才對。

    是在轉入 VBNET 有什麼障礙嗎?

    範例程式碼:

     Public Sub TestMemoryStreamArray()

      Dim picMS(3) As IO.MemoryStream
      Dim fs As IO.FileStream
      Dim arrBytes() As Byte
      Dim ibp, nLen As Integer

      For ibp = 0 To 3
       fs = New IO.FileStream("F:\照片\950809\PIC_000" & ibp + 1 & ".JPG", IO.FileMode.Open)
       nLen = fs.Length - 1
       ReDim arrBytes(nLen)

       With fs
        .Read(arrBytes, 0, nLen)
        .Close()
       End With

       picMS(ibp) = New IO.MemoryStream
       picMS(ibp).Write(arrBytes, 0, nLen)
      Next

     End Sub

    跟 VB6 應該也沒太多差異。

    2006年8月12日 上午 02:37
    版主

所有回覆

  • HI,

    讀取影像檔案的內容並顯示到PictureBox控制項, 可以使用FileStream類別:

    Dim fs As FileStream= New FileStream("檔案名稱", FileMode.Open, FileAccess.Read)
    Dim bmp As Bitmap = New Bitmap(fs)
    PictureBox1.Image = bmp
    fs.Close()

    讀取記憶體中的影像內容並顯示到PictureBox控制項, 可以使用MemoryStream類別:

    Dim ms As MemoryStream= New MemoryStream(存放影像內容的byte陣列)
    Dim bmp As Bitmap = New Bitmap(ms)
    PictureBox1.Image = bmp
    ms.Close()

    tihs

    2006年8月11日 上午 05:40
  •  

    感謝 璉璉tihs 大大

    剛才試了謝謝!!

    不好意思

    再請教一個問題

    如何使用 MemoryStream 的方式

    將 E:\img\0001.jpg~0200.jpg 的影像檔案 ( 外接儲存媒體 )

    先複製到 MemoryStream 裡面

    再依序將檔案顯示於 PictureBox1.Image  PictureBox2.Image ...上面

    ( 因為檔案很大,所以要先將檔案 Copy 到記憶體去(用多執行序), 再來顯示出來 )

    麻煩大大再幫我解答一下,感激不盡 ^_^

    2006年8月11日 下午 01:24
  • 前面給你的聯結就是將圖檔讀到 MemoryStream 去,就不會鎖住檔案。

    你如果做的還是先前那個數位相片沖印系統,效能會卡在讀卡機上,跟你有沒有多緒去讀圖檔沒啥關係。

    2006年8月11日 下午 02:11
    版主
  • 感謝 璉璉 大大回答

    但可能誤會我的意思

    *****有看到國外寫的是使用此方式********

    1-先顯示1-12張檔案

    2-在使用者看影像的空檔時利用

       多執行序將檔案從 ( 外接儲存媒體 )全部 Copy 到記憶體去

    3-使用者再按 [下一頁] 顯示13-24張檔案.....類推

       這時顯示的檔案就是從記憶體來顯示

       所以在換下一頁時就不用再等待

       等於先把全部檔案Copy 到記憶體, 而不是外接儲存媒體

       優點是檔案是從記憶體來讀取顯示(因為已經Copy 到記憶體)

       效能才不會卡在讀卡機上(因為檔案很大)

       有測試過璉璉大大給的參考

       是可以將檔案從記憶體來讀取顯示

       但是, 還是得從外接儲存媒體來讀取再丟給記憶體流內

       有辦法是從記憶體來讀取嗎(先批次Copy 到記憶體, 再從記憶體來顯示)?

       抱歉有點笨, 寫的不知道表達是否不明確 

      所以才會希望 璉璉大大們再提供參考

       感激不盡 ^_^

    2006年8月11日 下午 04:25
  • 你可以弄個 MemoryStream 陣列阿

    Memory 不就是記憶體嗎?

    至於多緒的部份,線上手冊逐步指引就很完整了。

    放在記憶體會吃 RAM 吃很重喔~

    2006年8月11日 下午 04:31
    版主
  • 感謝 璉璉 大大回答

    抱歉 ! 我是初學者

    怎樣弄個 MemoryStream 陣列??

    不懂~

    希望 璉璉 大大再提供類似參考或範例

       感激不盡  ^_^ Thanks!!

    2006年8月11日 下午 07:09
  • 小象:

    就先前在舊討論區跟你討論的經驗,依你使用 VB6 的程度應該不會問這種問題才對。

    是在轉入 VBNET 有什麼障礙嗎?

    範例程式碼:

     Public Sub TestMemoryStreamArray()

      Dim picMS(3) As IO.MemoryStream
      Dim fs As IO.FileStream
      Dim arrBytes() As Byte
      Dim ibp, nLen As Integer

      For ibp = 0 To 3
       fs = New IO.FileStream("F:\照片\950809\PIC_000" & ibp + 1 & ".JPG", IO.FileMode.Open)
       nLen = fs.Length - 1
       ReDim arrBytes(nLen)

       With fs
        .Read(arrBytes, 0, nLen)
        .Close()
       End With

       picMS(ibp) = New IO.MemoryStream
       picMS(ibp).Write(arrBytes, 0, nLen)
      Next

     End Sub

    跟 VB6 應該也沒太多差異。

    2006年8月12日 上午 02:37
    版主
  • 感謝 璉璉 大大回答

    不好意思~可能沒說清楚 , 因為工作需要才自修一年多

    買 Visual Studio .net 2003 與書 慢慢自己摸索

    所以有些可能基本的東東會比較不懂

     ( 所以啊 VB6 完全不會 *_^ )

    璉璉 大大 提供範例程式碼參考

    我會測試看看, 如有不懂之處 ,

    可能再麻煩璉璉大大指導喔!! Thanks ^_^

     

    2006年8月12日 上午 04:25
  • hi 璉璉 大大

    我就是之前那個小象啊

    我是使用 VB.net 開發 ,  對方是用 VB6 開發的

    所以啊 VB6 才完全不會 *_^

    所以有些可能基本的東東會比較不懂啦

    璉璉 大大 提供範例程式碼參考

    我會測試看看, 如有不懂之處 ,

    可能再麻煩璉璉大大指導喔!! Thanks ^_^

    2006年8月12日 上午 05:38
  • o~

    那是我混掉了...

    2006年8月12日 上午 05:52
    版主
  • hi 璉璉 大大

    弄好 MemoryStream 陣列後

    怎麼將它再依序顯示於 PictureBox1.Image  PictureBox2.Image ...上面???

    麻煩 璉璉大大 再幫我解答一下,感激不盡 ^_^

    2006年8月20日 上午 07:06
  • 基於校能考量,建議 PictureBoxN 轉換成陣列處理。

    在宣告區宣告一個

    Dim arrPic(11) As Object ' 你原先提過 12 PictureBox

    在 Form_Load 可以用

    arrPic = New Object() {PictureBox0, PictureBox1, ... }

    For i = 0 To 11

       arrPic(i) = GetFormControlByName(Me, "PictureBox" & i)

    Next

    其中:

    GetFormControlByName

    http://tlcheng.twbbs.org/TLCheng/Net/NetList.aspx?Action=Function&Module=26&Function=205

    2006年8月20日 上午 11:15
    版主
  • 漏了一句:

    變成陣列剩下的你應該會啦

    2006年8月20日 上午 11:16
    版主