none
PictureBox 控件是否只能用于显示位图、GIF、JPEG、图元文件或图标格式的图形?能否显示其它格式的图形?(vb.net) RRS feed

  • 问题

  • 大家好,请教:PictureBox 控件是否只能用于显示位图、GIF、JPEG、图元文件或图标格式的图形?能否显示其它格式的图形?
    昨夜西风凋碧树,独上高楼,望尽天涯路!
    2009年9月3日 1:50

答案

  • 你好,MSDN 定义 Windows 窗体 PictureBox 控件用于显示位图、GIF、JPEG、图元文件或图标格式的图形。其他格式Windows能支持打开的也是可以的,但是需要安装第三方软件打开的,Windows是无法解码的。
    jon.valett@gmail.com
    2009年9月3日 2:08
    版主
  • 你好 这应该是你从Access数据库读取图片出现问题了

    你好保存到数据库的时候应该这样
      //创建数组  
      byte[]   fileData   =   new   byte[fileLength];   
        //把图片文件流填充到数组  
      fileDataStream.Read(fileData,0,fileLength);  

    //这里是设置参数
    System.Data.OleDb.OleDbParameter   paramPersonImage   =   new   OleDbParameter("@PersonImage",   System.Data.OleDb.OleDbType.Binary);    
      paramPersonImage.Value   =   fileData;  
      command.Parameters.Add(paramPersonImage);  



    你可以通过Bitmap.FromStream 来读取从数据库取出的数据
    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond
    2009年9月3日 2:38
    版主
  • 你好,谢谢,我存入了一个gif格式的图片,从本地磁盘加载到picturebox中没有问题,也可以存入数据库,但从Access中调出图片显示在picturebox中时就出错了,不能在picturebox中显示。这是什么原因呢 ?
    昨夜西风凋碧树,独上高楼,望尽天涯路!
    您可以进行一下比对  我记得access可能会在前面加上几个字节 作为ole标示


    或者参考下面的代码


    http://www.cnblogs.com/syringa/articles/421587.html
    恭喜自己5星用户达成
    2009年9月3日 3:08
    版主
  • ''' <summary>
    ''' 将指定的图片信息存入到 Access 数据库
    ''' </summary>
    ''' <param name="fImageName">图片名</param>
    ''' <param name="fImageBinary">图片的 Byte</param>
    Public Sub InsertImageToAccess(ByVal fImageName As [String], ByVal fImageBinary As [Byte]())
        ' Access 表
        ' 字段
        ' ImageName 文本
        ' ImageBinary OLE 对象
        Using conn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\X.mdb")
            Dim fInsertCommand As New OleDbCommand()
            fInsertCommand.Connection = conn
            fInsertCommand.CommandText = "INSERT INTO Images (ImageName, ImageBinary) values (?, ?)"
            fInsertCommand.Parameters.Add("@ImageName", OleDbType.VarChar).Value = fImageName
            fInsertCommand.Parameters.Add("@ImageBinary", OleDbType.Binary, fImageBinary.Length).Value = fImageBinary
           
            conn.Open()
            fInsertCommand.ExecuteNonQuery()
        End Using
    End Sub
    ''' <summary>
    ''' 获取指定图片名的 Byte
    ''' </summary>
    ''' <param name="fImageName">图片名</param>
    ''' <returns></returns>
    Public Function GetImageFromAccess(ByVal fImageName As [String]) As [Byte]()
        Using conn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\X.mdb")
            Dim fSelectCommand As New OleDbCommand()
            fSelectCommand.Connection = conn
            fSelectCommand.CommandText = "SELECT ImageBinary FROM Images WHERE ImageName = ?"
            fSelectCommand.Parameters.Add("@ImageName", OleDbType.VarChar).Value = fImageName
           
            conn.Open()
            Dim o As Object = fSelectCommand.ExecuteScalar()
            Return (If(o Is Nothing, Nothing, DirectCast(o, [Byte]())))
        End Using
    End Function
    Private Sub button1_Click(ByVal sender As Object, ByVal e As EventArgs)
        Using dialog As New OpenFileDialog()
            dialog.Filter = "gif|*.gif"
            dialog.Multiselect = False
           
            If dialog.ShowDialog() = DialogResult.OK Then
                Dim fImageName As String = Path.GetFileNameWithoutExtension(dialog.FileName)
                Dim fs As New FileStream(dialog.FileName, FileMode.Open, FileAccess.Read)
                Dim br As New BinaryReader(fs)
                Dim fInputImageBinary As Byte() = br.ReadBytes(CInt(fs.Length))
                br.Close()
                fs.Close()
               
                ' 保存到数据库
                Me.InsertImageToAccess(fImageName, fInputImageBinary)
               
                ' 从数据库获取图片并显示到 pictureBox1
                Dim fOutputImageBinary As [Byte]() = Me.GetImageFromAccess(fImageName)
                Dim ms As New MemoryStream(fOutputImageBinary)
                pictureBox1.Image = Image.FromStream(ms)
            End If
        End Using
    End Sub

    知识改变命运,奋斗成就人生!
    2009年9月3日 3:26
    版主
  • 你好,谢谢,我存入了一个gif格式的图片,从本地磁盘加载到picturebox中没有问题,也可以存入数据库,但从Access中调出图片显示在picturebox中时就出错了,不能在picturebox中显示。这是什么原因呢 ?
    昨夜西风凋碧树,独上高楼,望尽天涯路!
    是你的代码写的有问题或者是数据库没有将字段类型设置为OLE

    完整的代码

    Imports System
    Imports System.IO
    Imports System.Data
    Imports System.Data.OleDb
    Public Class Form1
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            ''添加图片
            Dim o As System.IO.FileStream
            Dim r As StreamReader
            o = New FileStream("E:\bjxml20071016004.jpg", FileMode.Open, FileAccess.Read, FileShare.Read)
            r = New StreamReader(o)
            Dim FileByteArray(o.Length - 1) As Byte
            o.Read(FileByteArray, 0, o.Length)
    
            Dim cn As System.Data.OleDb.OleDbConnection = New System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\WebSite1\vb\WindowsApplication1\WindowsApplication1\Image2Access.mdb")
            cn.Open()
    
            Dim command As System.Data.OleDb.OleDbCommand = New System.Data.OleDb.OleDbCommand("INSERT INTO Person (PersonName,PersonEmail,PersonSex,PersonImageType,PersonImage) VALUES (@PersonName,@PersonEmail,@PersonSex,@PersonImageType,@PersonImage)", cn)
            command.Parameters.AddWithValue("@PersonName", "name")
            command.Parameters.AddWithValue("@PersonEmail", "mengxianhui@dotnet.aspx.cc")
            command.Parameters.AddWithValue("@paramPersonSex", "男")
            command.Parameters.AddWithValue("@PersonImageType", "image/jpeg")
            command.Parameters.AddWithValue("@PersonImage", FileByteArray)
            command.ExecuteNonQuery()
            cn.Dispose()
    
        End Sub
    
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            ''显示图片
            Dim memoryStream As System.IO.MemoryStream
            Dim cn As System.Data.OleDb.OleDbConnection = New System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\WebSite1\vb\WindowsApplication1\WindowsApplication1\Image2Access.mdb")
            cn.Open()
            Dim command As System.Data.OleDb.OleDbCommand = New System.Data.OleDb.OleDbCommand("select top 1 * from Person Order By PersonID DESC", cn)
            Dim dr As OleDbDataReader = command.ExecuteReader
            If (dr.Read) Then
                Dim buffer As Byte()
                buffer = CType(dr("PersonImage"), Byte())
                memoryStream = New System.IO.MemoryStream(buffer)
                Me.PictureBox1.Image = New System.Drawing.Bitmap(memoryStream)
                memoryStream.Dispose()
            End If
            cn.Dispose()
    
        End Sub
    End Class


    【孟子E章】
    2009年9月3日 4:20
    版主
  • 你好!
         尝试这些方法来解决:
    http://www.cnblogs.com/lgzslf/archive/2009/03/16/1412878.html
         希望对你有帮助!
    周雪峰
    2009年9月4日 5:21
    版主

全部回复

  • 你好,MSDN 定义 Windows 窗体 PictureBox 控件用于显示位图、GIF、JPEG、图元文件或图标格式的图形。其他格式Windows能支持打开的也是可以的,但是需要安装第三方软件打开的,Windows是无法解码的。
    jon.valett@gmail.com
    2009年9月3日 2:08
    版主
  • 我知道常用的 PNG 是支持的。
    知识改变命运,奋斗成就人生!
    2009年9月3日 2:18
    版主
  • 你好,谢谢,我存入了一个gif格式的图片,从本地磁盘加载到picturebox中没有问题,也可以存入数据库,但从Access中调出图片显示在picturebox中时就出错了,不能在picturebox中显示。这是什么原因呢 ?
    昨夜西风凋碧树,独上高楼,望尽天涯路!
    2009年9月3日 2:23
  • 你好 这应该是你从Access数据库读取图片出现问题了

    你好保存到数据库的时候应该这样
      //创建数组  
      byte[]   fileData   =   new   byte[fileLength];   
        //把图片文件流填充到数组  
      fileDataStream.Read(fileData,0,fileLength);  

    //这里是设置参数
    System.Data.OleDb.OleDbParameter   paramPersonImage   =   new   OleDbParameter("@PersonImage",   System.Data.OleDb.OleDbType.Binary);    
      paramPersonImage.Value   =   fileData;  
      command.Parameters.Add(paramPersonImage);  



    你可以通过Bitmap.FromStream 来读取从数据库取出的数据
    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond
    2009年9月3日 2:38
    版主
  • 你好,谢谢,我存入了一个gif格式的图片,从本地磁盘加载到picturebox中没有问题,也可以存入数据库,但从Access中调出图片显示在picturebox中时就出错了,不能在picturebox中显示。这是什么原因呢 ?
    昨夜西风凋碧树,独上高楼,望尽天涯路!
    您可以进行一下比对  我记得access可能会在前面加上几个字节 作为ole标示


    或者参考下面的代码


    http://www.cnblogs.com/syringa/articles/421587.html
    恭喜自己5星用户达成
    2009年9月3日 3:08
    版主
  • ''' <summary>
    ''' 将指定的图片信息存入到 Access 数据库
    ''' </summary>
    ''' <param name="fImageName">图片名</param>
    ''' <param name="fImageBinary">图片的 Byte</param>
    Public Sub InsertImageToAccess(ByVal fImageName As [String], ByVal fImageBinary As [Byte]())
        ' Access 表
        ' 字段
        ' ImageName 文本
        ' ImageBinary OLE 对象
        Using conn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\X.mdb")
            Dim fInsertCommand As New OleDbCommand()
            fInsertCommand.Connection = conn
            fInsertCommand.CommandText = "INSERT INTO Images (ImageName, ImageBinary) values (?, ?)"
            fInsertCommand.Parameters.Add("@ImageName", OleDbType.VarChar).Value = fImageName
            fInsertCommand.Parameters.Add("@ImageBinary", OleDbType.Binary, fImageBinary.Length).Value = fImageBinary
           
            conn.Open()
            fInsertCommand.ExecuteNonQuery()
        End Using
    End Sub
    ''' <summary>
    ''' 获取指定图片名的 Byte
    ''' </summary>
    ''' <param name="fImageName">图片名</param>
    ''' <returns></returns>
    Public Function GetImageFromAccess(ByVal fImageName As [String]) As [Byte]()
        Using conn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\X.mdb")
            Dim fSelectCommand As New OleDbCommand()
            fSelectCommand.Connection = conn
            fSelectCommand.CommandText = "SELECT ImageBinary FROM Images WHERE ImageName = ?"
            fSelectCommand.Parameters.Add("@ImageName", OleDbType.VarChar).Value = fImageName
           
            conn.Open()
            Dim o As Object = fSelectCommand.ExecuteScalar()
            Return (If(o Is Nothing, Nothing, DirectCast(o, [Byte]())))
        End Using
    End Function
    Private Sub button1_Click(ByVal sender As Object, ByVal e As EventArgs)
        Using dialog As New OpenFileDialog()
            dialog.Filter = "gif|*.gif"
            dialog.Multiselect = False
           
            If dialog.ShowDialog() = DialogResult.OK Then
                Dim fImageName As String = Path.GetFileNameWithoutExtension(dialog.FileName)
                Dim fs As New FileStream(dialog.FileName, FileMode.Open, FileAccess.Read)
                Dim br As New BinaryReader(fs)
                Dim fInputImageBinary As Byte() = br.ReadBytes(CInt(fs.Length))
                br.Close()
                fs.Close()
               
                ' 保存到数据库
                Me.InsertImageToAccess(fImageName, fInputImageBinary)
               
                ' 从数据库获取图片并显示到 pictureBox1
                Dim fOutputImageBinary As [Byte]() = Me.GetImageFromAccess(fImageName)
                Dim ms As New MemoryStream(fOutputImageBinary)
                pictureBox1.Image = Image.FromStream(ms)
            End If
        End Using
    End Sub

    知识改变命运,奋斗成就人生!
    2009年9月3日 3:26
    版主
  • 你好,谢谢,我存入了一个gif格式的图片,从本地磁盘加载到picturebox中没有问题,也可以存入数据库,但从Access中调出图片显示在picturebox中时就出错了,不能在picturebox中显示。这是什么原因呢 ?
    昨夜西风凋碧树,独上高楼,望尽天涯路!
    是你的代码写的有问题或者是数据库没有将字段类型设置为OLE

    完整的代码

    Imports System
    Imports System.IO
    Imports System.Data
    Imports System.Data.OleDb
    Public Class Form1
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            ''添加图片
            Dim o As System.IO.FileStream
            Dim r As StreamReader
            o = New FileStream("E:\bjxml20071016004.jpg", FileMode.Open, FileAccess.Read, FileShare.Read)
            r = New StreamReader(o)
            Dim FileByteArray(o.Length - 1) As Byte
            o.Read(FileByteArray, 0, o.Length)
    
            Dim cn As System.Data.OleDb.OleDbConnection = New System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\WebSite1\vb\WindowsApplication1\WindowsApplication1\Image2Access.mdb")
            cn.Open()
    
            Dim command As System.Data.OleDb.OleDbCommand = New System.Data.OleDb.OleDbCommand("INSERT INTO Person (PersonName,PersonEmail,PersonSex,PersonImageType,PersonImage) VALUES (@PersonName,@PersonEmail,@PersonSex,@PersonImageType,@PersonImage)", cn)
            command.Parameters.AddWithValue("@PersonName", "name")
            command.Parameters.AddWithValue("@PersonEmail", "mengxianhui@dotnet.aspx.cc")
            command.Parameters.AddWithValue("@paramPersonSex", "男")
            command.Parameters.AddWithValue("@PersonImageType", "image/jpeg")
            command.Parameters.AddWithValue("@PersonImage", FileByteArray)
            command.ExecuteNonQuery()
            cn.Dispose()
    
        End Sub
    
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            ''显示图片
            Dim memoryStream As System.IO.MemoryStream
            Dim cn As System.Data.OleDb.OleDbConnection = New System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\WebSite1\vb\WindowsApplication1\WindowsApplication1\Image2Access.mdb")
            cn.Open()
            Dim command As System.Data.OleDb.OleDbCommand = New System.Data.OleDb.OleDbCommand("select top 1 * from Person Order By PersonID DESC", cn)
            Dim dr As OleDbDataReader = command.ExecuteReader
            If (dr.Read) Then
                Dim buffer As Byte()
                buffer = CType(dr("PersonImage"), Byte())
                memoryStream = New System.IO.MemoryStream(buffer)
                Me.PictureBox1.Image = New System.Drawing.Bitmap(memoryStream)
                memoryStream.Dispose()
            End If
            cn.Dispose()
    
        End Sub
    End Class


    【孟子E章】
    2009年9月3日 4:20
    版主
  • 你好,谢谢,我就是这样写的代码,提示错误 “GDI+ 中发生一般错误”,这是怎么回事呢 ?
    昨夜西风凋碧树,独上高楼,望尽天涯路!
    2009年9月3日 13:20
  • 你好!
         尝试这些方法来解决:
    http://www.cnblogs.com/lgzslf/archive/2009/03/16/1412878.html
         希望对你有帮助!
    周雪峰
    2009年9月4日 5:21
    版主