none
[問題][vb.net2003]如何取得picturebox入面image的loaction???? RRS feed

  • 問題

  •  

    如果取得picturebox內,已經加入了的image位置?

    -----------------------------------

    另一個問題:)

    我想將mage的位置放入database

    等下次再開form的時候會從database中取出image的位置,

    將image位置給picturebox,並將圖貼在form中的picture上

    ---------

    問題:)如果在第一次輸入資料中...user沒有輸入圖....

    那當下一次取圖時...會否發生error?..有什麼方法可以防止?

    例如:)....If IsDBNull(存放image loaction的database位置)Then
                    picturebox1.location = ""
                Else
                    picturebox1.location = (存放image loaction的database位置)

              End If

    這樣可以嗎?

     PS:我用的應該是Microsoft .NET Framework 1.1

    2006年8月18日 上午 03:30

解答

  • 嗯,比你開頭的問題清楚多了 .

    Q1.

    因為 .NET 1.x 的 PictureBox 的限制,你只能夠由 Image.FromFile()(假設你已經知道影像檔路徑)來產生 Image 物件,然後再把它設定給 PictureBox.Image,例如:

    Dim imageObject As System.Drawing.Image = System.Drawing.Image.FromFile(...) ' 載入影像
    PictureBox1.Image = imageObject ' 指定給 PictureBox

    而且,Image 並沒有 Location 這個屬性,所以你要另外存,看你的程式實作方法,如果只有一個圖,可用一個字串變數暫存,若有多個,則可以用字串陣列或是 ArrayList 來存,我自己的話會把這兩個東西包在一起,但這個實作比較小複雜,所以在此不提了,留給你研究(提示:使用 Class)

    Q2.

    如果你的路徑存在資料庫,而且可以確實讀到的話(怕你是網路環境),你可以先把路徑由資料庫讀出,再用 Q1 的方法來處理就行了 .

    Q3.

    資料庫(我以 MS-SQL Server 為例子)通常會有一個欄位型態,專門儲存大量的二進位資料(就是我說的 byte 陣列),這類欄位型態叫做 BLOB (大型二進位資料),SQL Server 的 image 資料型態就是如此,因為它寫入資料庫的格式是二進位資料,所以讀出來時會需要以一個 byte 陣列來儲存,然後把它交給 MemoryStream,再用 Image.FromStream() 把圖讀到物件中,最後按照 Q1 的方法給定即可 .

    通常把大量的圖存到資料庫,並不會使資料庫死掉,只怕在 I/O 時速度會變慢一點,所以圖都不會存太大的,不然就要有高效能 I/O 的硬體來處理這種負載 .

    2006年8月18日 上午 08:01
    版主

所有回覆

  • 請問,你問問題的風格都是這樣嗎?

    因為板龜還沒放出來,先給與口頭上的警告,請你把問題整理清楚一點,這也是一種網路禮貌吧?
    還有,一個主題請問一個問題就好,除非問題之間有很高的相關性 .

    回應你的問題 .

    • 如果是在 ASP.NET 下,可以用 ImageUrl 來取得影像的來源,在 Windows Forms 下,如果你的來源是影像檔案,可以用 ImageLocation(.NET 2.0 才有)來取得影像的位置,不然就要先產生 Image 物件再設給 PictureBox.Image,不過如果是設定 PictureBox.Image 的方式來給值的話,ImageLocation 無法取得位置 .
    • 沒有圖的話,你可以設定空值(string.empry)給 PictureBox.ImageLocation,但如果你是用 .NET 1.x 的話,就只能設定 PictureBox.Image = Nothing .
    2006年8月18日 上午 04:32
    版主
  • 或許這個習慣還是要一些時間才可能沬掉

    我想這兩個問題都關於picturebox,應該貼在同一文章吧...

    兩個問題都是關於image的location問題..如果這樣還要細分............

    but anyway我會配合你們的要求.......只是你們覺得合適的...就可以了

    反正細分問題對我而言沒什麼問題或麻煩......

    我唯有盡量的配合吧~還請以後多加提點

    ------------------------------------------------

    我明白大家的距離很遠.....或許你的答覆是很專業...

    可惜的是...我看不明白.....

    imagelocation根本不能用.......imageurl也不能

    究竟要怎樣做才好?....給多點提示吧

    Anyaway, 先多謝你的回覆

    2006年8月18日 上午 06:42
  • 我不知道你的影像來源,所以我只能假定你的影像資料是來自於資料庫,並使用二進位檔案格式儲存 .
    這樣的情況讀檔時就依下列範例的描述來做就可以了 . 但 PictureBox 在 .NET 1.x 時並沒有 ImageLocation 這個東西,在 .NET 2.0 才有,所以就算你把影像讀入了 PictureBox,你仍然無法由 PictureBox 知道它的來源,這也表示說你要另外其他的方法來記憶 .

    Dim cn As New System.Data.OleDb.OleDbConnection("Your Connection String")
    Dim cmd As New System.Data.OleDb.OleDbCommand("Your Select Command", cn)
    Dim dr As System.Data.OleDb.OleDbDataReader
    Dim pictureColumn As Integer = 0
    Dim b(Integer.MaxValue - 1) As Byte

    cn.Open()
    dr = cmd.ExecuteReader()
    dr.Read()
    dr.GetBytes(pictureColumn, 0, b, 0, b.Length)
    dr.Close()
    cn.Close()

    MessageBox.Show("Bytes read from database: " & b.Length.ToString())

    Dim bs As System.IO.Stream = New System.IO.MemoryStream()
    bs.Write(b, 0, b.Length)

    PictureBox1.Image = Image.FromStream(bs)

    2006年8月18日 上午 07:04
    版主
  • 是我說得不清楚嗎?

    假設我form中有一個button和一個picturebox

    按一下button就可以插入圖片到picturebox

    先假定我加入的是jpg....從"c:\image\" 來的....

    Q1:...我怎樣才能用一件物件去裝那個image的location???

             用string就可以嗎?

    再假設我將那個圖片的location 存於database中..

    Q2:) 當下一個重新load form後便能把圖自動跳出來(當然是假設根據某某條件而得出那個圖片的地址啦)

    可以怎做?

    我想應該先用select command拿出想要的圖片location...再將picturebox.image.location = 那個圖片的location

    這不就可以嗎?.....或許我想得比較簡單.....希望大人多多賜教........

    ------------------------------

    根據你的回覆..我有個問題想問.....(應該不用開新的文章吧....)

    subQ a:)請問為什麼要用Bytes save image???...(這個format好像只從C language中學過).....

     

    ps:)我想 save的都是image的location...因為我想database存太多圖的話..可能會很慢或死亡......

    ------------------------

    感謝你的回覆....你回覆的都是關於從database中取出圖片...

    由於我未能將image的location存放在datadase所以無法嘗試.....抱歉....

     

     

     

     

    2006年8月18日 上午 07:41
  • 嗯,比你開頭的問題清楚多了 .

    Q1.

    因為 .NET 1.x 的 PictureBox 的限制,你只能夠由 Image.FromFile()(假設你已經知道影像檔路徑)來產生 Image 物件,然後再把它設定給 PictureBox.Image,例如:

    Dim imageObject As System.Drawing.Image = System.Drawing.Image.FromFile(...) ' 載入影像
    PictureBox1.Image = imageObject ' 指定給 PictureBox

    而且,Image 並沒有 Location 這個屬性,所以你要另外存,看你的程式實作方法,如果只有一個圖,可用一個字串變數暫存,若有多個,則可以用字串陣列或是 ArrayList 來存,我自己的話會把這兩個東西包在一起,但這個實作比較小複雜,所以在此不提了,留給你研究(提示:使用 Class)

    Q2.

    如果你的路徑存在資料庫,而且可以確實讀到的話(怕你是網路環境),你可以先把路徑由資料庫讀出,再用 Q1 的方法來處理就行了 .

    Q3.

    資料庫(我以 MS-SQL Server 為例子)通常會有一個欄位型態,專門儲存大量的二進位資料(就是我說的 byte 陣列),這類欄位型態叫做 BLOB (大型二進位資料),SQL Server 的 image 資料型態就是如此,因為它寫入資料庫的格式是二進位資料,所以讀出來時會需要以一個 byte 陣列來儲存,然後把它交給 MemoryStream,再用 Image.FromStream() 把圖讀到物件中,最後按照 Q1 的方法給定即可 .

    通常把大量的圖存到資料庫,並不會使資料庫死掉,只怕在 I/O 時速度會變慢一點,所以圖都不會存太大的,不然就要有高效能 I/O 的硬體來處理這種負載 .

    2006年8月18日 上午 08:01
    版主
  • 先感謝小朱的回覆

    問題:
    我現在正製作一個程式....用來透過database(mysql)
    紀錄一些圖片的location.....並可以在以後update,add,delete該筆資料
    --------------

    剛剛發現了一件事:

    我自行在database(mysql)中加入圖片的位置

    假設我選該筆資料....並按了update這個button



    所有資料都放上了textbox和picturebox上....
    這是沒有問題的.........

    ------------>但是………
    假設我在該程式中自行update,即改變圖片的位置(即更換圖片)

    並save在database內

    當下次按update的button的時..便發生了以下問題:

    picturebox不能根據database回傳的圖片位置找到圖片....
    所以出現了error....
    我想一定是圖片位置在寫入database中的時候發生錯誤..或是有誤差
    而導致下一次update時picturebox不能從database中取出正確的圖片位置.........

    請問大人是什麼問題????

    coding如下:)

    Private Sub show_picimage()
            Dim mysql As String 'textbox991是indexcode的位置
            mysql = "select * from piclogsheet where logCode = '" & TextBox99.Text & "'"
            Dim da As New OdbcDataAdapter(mysql, cn)
            ds.Clear()
            cn.Open()
            da.Fill(ds, "piclogsheet")
            cn.Close()
            DataGrid2.DataSource = ds
            DataGrid2.DataMember = "piclogsheet"
            DataGrid2.Enabled = True
            cmd.CommandText = mysql
            cmd.Connection = cn
            cn.Open()
            dr = cmd.ExecuteReader
            TextBox1.Clear()
            While dr.Read
                PictureBox1.Image = Image.FromFile(dr.Item("local1"))
                PictureBox2.Image = Image.FromFile(dr.Item("local2"))
                PictureBox3.Image = Image.FromFile(dr.Item("local3"))
                PictureBox4.Image = Image.FromFile(dr.Item("local4"))
                piclocal1 = (dr.Item("local1"))
                piclocal2 = (dr.Item("local2"))
                piclocal3 = (dr.Item("local3"))
                piclocal4 = (dr.Item("local4"))
            End While
            Me.PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
            Me.PictureBox1.BorderStyle = BorderStyle.Fixed3D
            Me.PictureBox2.SizeMode = PictureBoxSizeMode.StretchImage
            Me.PictureBox2.BorderStyle = BorderStyle.Fixed3D
            Me.PictureBox3.SizeMode = PictureBoxSizeMode.StretchImage
            Me.PictureBox3.BorderStyle = BorderStyle.Fixed3D
            Me.PictureBox4.SizeMode = PictureBoxSizeMode.StretchImage
            Me.PictureBox4.BorderStyle = BorderStyle.Fixed3D
            cn.Close()
    ---------------------------------------------------------------------------------
    Dim piclocal1 As String
        Dim piclocal2 As String
        Dim piclocal3 As String
        Dim piclocal4 As String
    ------------------------------

    cmd.CommandText = "update piclogsheet set local1='" & piclocal1 & "',local2='" & piclocal2 & "',local3='" & piclocal3 & "',local4='" & piclocal4 & "' where logCode='" & TextBox99.Text & "'"
                    cn.Open()
                    cmd.Connection = cn
                    cmd.ExecuteNonQuery()
                    cn.Close()

    2006年8月21日 上午 04:42
  • 你檢查一下你由資料庫輸出的路徑對不對 ...

    因為看你的錯誤訊息就已經知道路徑格式不對了 =.=

    2006年8月21日 上午 06:29
    版主
  • 終於找到了是什麼是一回事.....

    假設我要將圖片的位置放入database中

    我先dim piclocal  as string

    在圖片被插入的同時...

    If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
                PictureBox4.Image = Image.FromFile(OpenFileDialog1.FileName)
            End If

    我將  piclocal = OpenFileDialog1.FileName

    假設我用messagebox.show(piclocal)先看看究竟傳輸了什麼去database(mysql)

    """C:\Documents and Settings\sels\桌面\photo print\27.jpg"""

    沒問題吧.....

    但當假設piclocal內的東西存到去database入

    我再由database中抽出其位置看看

    MessageBox.Show(dr.Item("local1"))    'local1 是該存放圖片位置的column

    結果是:        "C:Documents and Settingssels桌面photo print27.jpg"

    為什麼會這樣???....

    我用的是mysql

    local1的datatype是varchar{255}

    請大人解答.......感謝

    2006年8月23日 上午 03:30
  • 你是怎麼寫到資料庫的?
    2006年8月23日 上午 05:20
    版主
  •     Dim piclocal1 As String
        Dim piclocal2 As String
        Dim piclocal3 As String
        Dim piclocal4 As String

    '假設piclogsheet是table的名稱

    'piclocal是裝著圖片位置的變數

    'txtbox99裝著indexcode

    local 1-4 是4個database的column

    假設整個database table內包含 logcode,local1,local2,local3,local4....5個columns,

    cmd.CommandText = "update piclogsheet set local1='" & piclocal1 & "',local2='" & piclocal2 & "',local3='" & piclocal3 & "',local4='" & piclocal4 & "' where logCode='" & TextBox99.Text & "'"


                    cn.Open()
                    cmd.Connection = cn
                    cmd.ExecuteNonQuery()
                    cn.Close()

     

    有問題嗎?

    2006年8月23日 上午 06:40
  • 你用除錯器追看看在下更新指令時,piclocal1, piclocal2, piclocal3 和 piclocal4 的值各為什麼?

    通常以文字寫入資料庫時不太可能會切斷路徑的字元才對 ...

    2006年8月23日 上午 08:52
    版主
  • 非常怪異的事情發生了~

    想不到會在我的身上發生...我還是第一次發生這樣的情況....

    請大家看了後不要只管驚訝...要幫我想想解決的辦法喔~

    我將4幅圖片的地址分別加入在4個變數中

    piclocal1,piclocal2,piclocal3,piclocal4

    如圖下所見:

    4個變數所載的內容:--->

    其實我早就在add的過程中,加入了messagebox..好樣我能夠看看變數內是什麼:

    在這個步驟...messagebox所show的內容是正常的

    這一幅是程運行到command的時候.....command內所載的是什麼東西-->

    如圖所見...所載入的是正常的

    可是在載入完畢後,我在mysql中refesh了看過究竟...發現--->

    變數入的地址全都變了......

    -----------------

    我想知道是什麼的一回事???

    是我錯set了什麼?還是遺漏了什麼?還是我本人攪錯?

    coding如下

    以下是4個picturebox...的地址..加入4個變數中-->

    Private Sub InitializePictureBox()
            ' 將 SizeMode 屬性設定成 StretchImage,將使得 PictureBox 內
            ' 的影像會縮小或放大使之完全符合 PictureBox 的大小。
            Me.PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
            ' 使 PictureBox 擁有一個立體框線。
            Me.PictureBox1.BorderStyle = BorderStyle.Fixed3D
        End Sub
        'PictureBox1
        Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click
            If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
                PictureBox1.Image = Image.FromFile(OpenFileDialog1.FileName)
            End If
            'ReSizeShowImage(sender, picImage)
            InitializePictureBox()
            piclocal1 = OpenFileDialog1.FileName
        End Sub
        'PictureBox2
        Private Sub Button8_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button8.Click
            If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
                PictureBox2.Image = Image.FromFile(OpenFileDialog1.FileName)
            End If
            'ReSizeShowImage(sender, picImage)
            Me.PictureBox2.SizeMode = PictureBoxSizeMode.StretchImage
            Me.PictureBox2.BorderStyle = BorderStyle.Fixed3D
            piclocal2 = OpenFileDialog1.FileName
        End Sub
        'PictureBox3
        Private Sub Button9_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button9.Click
            If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
                PictureBox3.Image = Image.FromFile(OpenFileDialog1.FileName)
            End If
            'ReSizeShowImage(sender, picImage)
            Me.PictureBox3.SizeMode = PictureBoxSizeMode.StretchImage
            Me.PictureBox3.BorderStyle = BorderStyle.Fixed3D
            piclocal3 = OpenFileDialog1.FileName
        End Sub
        'PictureBox4
        Private Sub Button10_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button10.Click
            If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
                PictureBox4.Image = Image.FromFile(OpenFileDialog1.FileName)
            End If
            'ReSizeShowImage(sender, picImage)
            Me.PictureBox4.SizeMode = PictureBoxSizeMode.StretchImage
            Me.PictureBox4.BorderStyle = BorderStyle.Fixed3D
            piclocal4 = OpenFileDialog1.FileName
        End Sub

     

    以下是add的coding-->

    'Add function
        Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
            'Add function
            Dim logcode As String
            Dim cost As String
            Dim mattcost As String
            Dim matting As String
            'checking textbox field
            Try
                If dup() Then
                    MessageBox.Show("record duplicate")
                Else
                    If checking_add_field() = False Then
                        'MessageBox.Show("Your information is not satisfy to this form, please check again!!")
                        Exit Sub
                    Else
                        'Creating inputdata
                        logcode = CreatAreaname() & Creatlogcode() & TextBox1.Text
                        TextBox99.Text = logcode
                        cost = "$" & TextBox3.Text
                        mattcost = "$" & TextBox7.Text
                        matting = TextBox5.Text & " mm"

                        'Start add action
                        cmd.CommandText = "insert into equiplogsheet values ('" & logcode & "','" & ComboBox1.Text & "','" & ComboBox3.Text & "','" & TextBox1.Text & "','" & ComboBox2.Text & "','" & ComboBox4.Text & "','" & ComboBox5.Text & "','" & ComboBox6.Text & "','" & TextBox2.Text & "','" & ComboBox7.Text & "','" & cost & "','" & TextBox4.Text & "','" & matting & "','" & ComboBox8.Text & "','" & ComboBox9.Text & "','" & TextBox6.Text & "','" & ComboBox10.Text & "','" & mattcost & "','" & TextBox8.Text & "')"
                        cn.Open()
                        cmd.Connection = cn
                        cmd.ExecuteNonQuery()
                        cn.Close()
                        MessageBox.Show(piclocal1)
                        MessageBox.Show(piclocal2)
                        MessageBox.Show(piclocal3)
                        MessageBox.Show(piclocal4)
                        cmd.CommandText = "insert into piclogsheet values ('" & logcode & "','" & piclocal1 & "','" & piclocal2 & "','" & piclocal3 & "','" & piclocal4 & "')"
                        cn.Open()
                        cmd.Connection = cn
                        cmd.ExecuteNonQuery()
                        cn.Close()

                        GroupBox2.Enabled = False
                        ComboBox2.Enabled = False
                        ComboBox11.Enabled = True
                        TextBox1.Enabled = False
                        Button1.Enabled = True
                        Button2.Enabled = True
                        Button6.Enabled = True
                        Button3.Enabled = True
                        Button5.Enabled = True
                        Button4.Enabled = False
                        Button7.Enabled = False
                        Button8.Enabled = False
                        Button9.Enabled = False
                        Button10.Enabled = False
                    End If
                    Call renew_record()
                End If
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub

     

     

    2006年8月23日 上午 09:41
  • 請各位大人多多回應...

    給我一點頭緒..提示

    要是找不到解決的方法..

    可否有另一個方法達到同樣的目的呢?

    (即假設要將圖片插入picturebox,在第2個問form的時候..圖片能自動貼回picturebox上)

     

    感謝各位大人抽時間的觀看......

    2006年8月23日 上午 09:46
  • 這種狀況我還是第一次看到 .
    我也用 MySQL,但我是用 MySQL Connector for .NET 去連接的 .
    沒發生過你的問題 ...

    不知道你的 MySQL 版本?連接的工具與版本?資料庫用的語系是?

    你可以試試看 MySQL Query Browser(download from http://www.mysql.com),很好用 ...

    2006年8月23日 上午 09:48
    版主