PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : VB: Bild in PictureBox laden?


mf_2
2005-08-20, 18:20:19
Hallo,

Ich habe die kostenlose Beta2 von MS Visual Studio 2005 und programmiere in VB.Ich wollte nun eine picturebox in mein prog einbauen lassen und dann ein bild darin anzeigen. das klappt auch ganz gut wenn es immer dasselbe bild ist. nun soll der user aber ein bild vom inet auswählen können ( von meinem server genauer gesagt ) und soll es dann sehen. ich habe schon eine variable mit dem absoluten pfad zum bild ( http://server/bild.jpg ), nur wie bekomme ich das hin, dass das bild in der picturebox angezeigt wird. wharscheinlich ist es was ganz triviales, ich bvin aber sehr neu in VB. ich hab mir auch den sticky hier durchgelsen und unter anderem bei MSDN vorbeigeschaut, hat mir aber ned weitergeholfen.
Hoffentlich könnt ihr mir helfen.

Xmas
2005-08-20, 18:55:12
http://msdn2.microsoft.com/library/5t9y35bd(en-us,vs.80).aspx

Hier ist ein Beispiel, wie du mit WebRequest per HTTP eine Datei anforderst. Das Stream-Objekt kannst du dann mit Image.FromStream verwenden und erhältst so ein Image, dass du in der PictureBox verwenden kannst.

mf_2
2005-08-20, 20:16:35
Ok, thx schonmal. Abr mein eigentliches Problem: Wie ist der Befehl, das Image in der PictureBox anzeigen zu lassen?

Xmas
2005-08-20, 23:32:14
pictureBox.Image = [irgendein Image-Objekt]

mf_2
2005-08-21, 00:08:25
Hallo,

Also vllt. bin ich zu dumm aber hier ist mein code:

' Create a request for the URL.
Dim request As WebRequest = WebRequest.Create("http://server/bild.jpg")
' If required by the server, set the credentials.
request.Credentials = CredentialCache.DefaultCredentials
' Get the response.
Dim response As HttpWebResponse = CType(request.GetResponse(), HttpWebResponse)
' Display the status.
Console.WriteLine(response.StatusDescription)
' Get the stream containing content returned by the server.
Dim dataStream As Stream = response.GetResponseStream()
' Open the stream using a StreamReader for easy access.
Dim reader As New StreamReader(dataStream)
' Read the content.
Dim responseFromServer As String = reader.ReadToEnd()
' Display the content.
Dim iconAlbum As New PictureBox
iconAlbum.Image(responseFromServer)
' Console.WriteLine(responseFromServer)
' Cleanup the streams and the response.
reader.Close()
dataStream.Close()
response.Close()

der gibt mir nur nen kleinen fehler:
die zeile
iconAlbum.Image(responseFromServer)
is blau unterstrichen und hat den fehler 'property access must assign to the property or use its value'
Was genau heisst das?
wie gesagt, ich bin ein vb neuling.
Ansonsten funzt es aber glaube ich. Das ist die einzige markierte Zeile im code.

mf_2
2005-08-21, 01:07:34
ich habs jetzt etwas geändert, aber immer noch derselbe fehler in derselben zeile. hier ist der neue code:

' Create a request for the URL.
Dim request As WebRequest = WebRequest.Create("http://server/bild.jpg")
' If required by the server, set the credentials.
request.Credentials = CredentialCache.DefaultCredentials
' Get the response.
Dim response As HttpWebResponse = CType(request.GetResponse(), HttpWebResponse)
' Display the status.
' Console.WriteLine(response.StatusDescription)
' Get the stream containing content returned by the server.
Dim dataStream As Stream = response.GetResponseStream()
' Open the stream using a StreamReader for easy access.
Dim reader As New StreamReader(dataStream)
' Read the content.
' Dim responseFromServer As String = reader.ReadToEnd()
Dim imagenew As New Object
imagenew = Image.FromStream(dataStream)
' Display the content.
Dim iconAlbum As New PictureBox
iconAlbum.Image(imagenew)
' Console.WriteLine(responseFromServer)
' Cleanup the streams and the response.
reader.Close()
dataStream.Close()
response.Close()

Xmas
2005-08-21, 22:01:28
Erst mal kommt der StreamReader komplett raus, der gehört nur zum Beispiel und wird für Image.FromStream nicht benötigt.

Und dann ist PictureBox.Image keine Methode, sondern eine Eigenschaft. Und die wird nicht mit Klammern aufgerufen, sondern mit = zugewiesen:

iconAlbum.Image = imagenew

mf_2
2005-08-22, 09:34:08
thx jetzt ist die fehlermeldung weg, aber es passiert dann einfach nichts wenn och auf den button klicke der diesen code ausführen soll.

mein code sieht jetzt so aus:

' Create a request for the URL.
Dim request As WebRequest = WebRequest.Create("http://localhost/bild.jpg")
' If required by the server, set the credentials.
request.Credentials = CredentialCache.DefaultCredentials
' Get the response.
Dim response As HttpWebResponse = CType(request.GetResponse(), HttpWebResponse)
' Display the status.
' Console.WriteLine(response.StatusDescription)
' Get the stream containing content returned by the server.
Dim dataStream As Stream = response.GetResponseStream()
' Open the stream using a StreamReader for easy access.
' Dim reader As New StreamReader(dataStream)
' Read the content.
' Dim responseFromServer As String = reader.ReadToEnd()
Dim imagenew As New Object
imagenew = Image.FromStream(dataStream)
' Display the content.
Dim iconAlbum As New PictureBox
iconAlbum.Image = imagenew
' Console.WriteLine(responseFromServer)
' Cleanup the streams and the response.
' reader.Close()
dataStream.Close()
response.Close()

mf_2
2005-08-23, 08:26:07
weiss keiner eine lösung?

mf_2
2005-08-23, 23:00:24
Ich hab nen neuen Ansatz.Ich hab im internet ne funktion graphics.DrawImage(Image, AutoScrollPosition.X, AutoScrollPosition.Y, Image.Width, Image.Height) gefunden.
diese wird zb so angesprochen:
f.graphics.DrawImage(Image, AutoScrollPosition.X, AutoScrollPosition.Y, Image.Width, Image.Height)

dazu muss aber in der zeile wo die private sub definiert wird ( zwischen den klammern ) folgendes stehen: 'ByVal f As System.Windows.Forms.PaintEventArgs'
Also würde meine erste zeile der private sub so aussehen:
Private Sub showAlbum_Click(ByVal sender As System.Object, ByVal e As System.EventArgs, ByVal f As System.Windows.Forms.PaintEventArgs) Handles showAlbum.Click
Ich hab einfach das byval f zeug eingefügt. das würde auch gehen,,wenn da nicht 'Handles showAlbum.Click' stehen würde. dann bekomm ich nämlich folgenden fehler:
Method 'Private Sub showAlbum_Click(sender As Object, e As System.EventArgs, f As System.Windows.Forms.PaintEventArgs)' cannot handle Event 'Public Event Click(sender As Object, e As System.EventArgs)' because they do not have the same signature.

ich hab keine ahnung wie ich das weg bekomme. gibt es noch ne andere möglichkeit, die graphics.drawImage funktion verfügbar zu machen?

Xmas
2005-08-23, 23:14:14
Du musst die PictureBox auch in einem Fenster anzeigen, also einer Form hinzufügen... oder du benutzt eine im Forms-Designer erstellte PictureBox.

mf_2
2005-08-24, 01:00:02
ich benutze eine im form designer erstellte picturebox. sie wird auch angezeigt, nur ist sie eben leer ( und bleibt dies auch wenn uch auf den button klicke, der den code ausführen sollte um ein bild aus dem inet anzuzeigen ).

Juerg
2005-08-24, 11:40:55
Versuch mal die Grafikdatei folgendermassen einzubinden:
(Um zu verifizieren, dass nicht der Stream Probleme macht...)

PictureBox1.Image = System.Drawing.Image.FromFile("C:\sample.jpg")
oder auch
PictureBox1.Image = System.Drawing.Bitmap.FromFile("C:\sample.bmp")

mf_2
2005-08-24, 14:34:08
Hallo,
da wird immer noch kein bild angezeigt. ABER: es wird wohl auf das bild zugegriffen. Weil: ich wollte das bild verändrn und neu abspeichern, aberr dann gab mir paint ne sharing violation. dann hab ich mein prog beendet und bei paint nochmals auf speichern geklickt und dann ging es.

Xmas
2005-08-24, 15:59:34
Poste doch mal den gesamten Code des ButtonClick-Handlers, unverändert und mit [code]-Tag.

mf_2
2005-08-24, 21:59:19
hier ist er:



Private Sub showAlbum_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles showAlbum.Click


' Create a request for the URL.
Dim request As WebRequest = WebRequest.Create("http://localhost/bild.jpg")
' If required by the server, set the credentials.
request.Credentials = CredentialCache.DefaultCredentials
' Get the response.
Dim response As HttpWebResponse = CType(request.GetResponse(), HttpWebResponse)
' Display the status.
' Console.WriteLine(response.StatusDescription)
' Get the stream containing content returned by the server.
Dim dataStream As Stream = response.GetResponseStream()
' Open the stream using a StreamReader for easy access.
' Dim reader As New StreamReader(dataStream)
' Read the content.
' Dim responseFromServer As String = reader.ReadToEnd()
Dim imagenew As Bitmap
imagenew = Image.FromStream(dataStream)
' Display the content.
Dim iconAlbum As New PictureBox
Dim coolimage As String
coolimage = "C:\background.bmp"
' iconAlbum.Image = Image.FromFile(coolimage)
iconAlbum.Image = System.Drawing.Bitmap.FromFile("C:\background.bmp")
' Console.WriteLine(responseFromServer)
' Cleanup the streams and the response.
' reader.Close()
dataStream.Close()
response.Close()
MsgBox("Hallo")
' Dim curImage As Image = Image.FromFile("C:\background.bmp")
' f.Graphics.DrawImage(curImage, AutoScrollPosition.X, AutoScrollPosition.Y, curImage.Width, curImage.Height)

End Sub

mf_2
2005-08-24, 22:00:41
achja, die msgbox am schluss war nur um sicherzustellen ob der ganze code abgearbeitet wird. und ja, er wird abgearbeitet, da die msgbóx angezeigt wird

Xmas
2005-08-24, 22:51:54
ich benutze eine im form designer erstellte picturebox. sie wird auch angezeigt, nur ist sie eben leer ( und bleibt dies auch wenn uch auf den button klicke, der den code ausführen sollte um ein bild aus dem inet anzuzeigen ).

Dim iconAlbum As New PictureBox


Ja, da ist auch kein Wunder dass die im Form Designer erstellte PictureBox leer bleibt... wenn du statt dessen ein neues PictureBox-Objekt verwendest, das weder Größe noch Position noch Owner-Fenster gesetzt hat.


achja, die msgbox am schluss war nur um sicherzustellen ob der ganze code abgearbeitet wird. und ja, er wird abgearbeitet, da die msgbóx angezeigt wird
Dafür setzt man Breakpoints und lässt das Programm im Debug-Modus laufen.

mf_2
2005-08-24, 23:56:20
sry,das ist peinlich :biggrin:

naja, jetzt gehts. ein großes dankeschön an Xmas für deine Hilfe! THX!

juhu!

mf_2
2005-08-25, 01:30:14
und schon wieder ein problem:

ich will dass eine ansammlung von code aussgeführt wird. dazu habe ich sie in eine funktion geschrieben. danach wird diese sofort aufgerufen.

das ist der codeabschnitt:



' Private Sub photosload(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles photosPopulate.Click
Public Function photosload()
Dim conn As New MySqlConnection
Dim myCommand As New MySqlCommand
Dim myAdapter As New MySqlDataAdapter
Dim myData As New DataTable
Dim myReader As MySqlDataReader
Dim SQL As String

SQL = "server=localhost;" _
& "user id=1;" _
& "password=1;" _
& "database=1"

conn.ConnectionString = SQL


SQL = "SELECT * " _
& "FROM xx " _
& "WHERE(uid='1')"

Try
conn.Open()

Try
myCommand.Connection = conn
myCommand.CommandText = SQL

myReader = myCommand.ExecuteReader

While myReader.Read
cboAlbums.Items.Add(New clsMessage(myReader.GetValue(0), _
myReader.GetValue(1)))
End While

cboAlbums.SelectedIndex = 0
Catch myerror As MySqlException
MsgBox("There was an error reading from the database: " & myerror.Message)
End Try
Catch myerror As MySqlException
MessageBox.Show("Error connecting to the database: " & myerror.Message)
Finally
If conn.State <> ConnectionState.Closed Then conn.Close()
End Try

Return 0

End Function
' End Sub

photosload()



Also da soll nur ne combobox mit einträgen aus ner mysql-db gefüllt werden. ich hatte diese funktion bisher als private sub die ausgeführt wurde wenn n bestimmter button geklickt wurde. jetzt möchte ich aber das es gleich beim programmstart automatisch gemacht wird. deswegen ruft die funtkion sich selber auf. oder is das n denkfehler von mir?
ich hab in der vb net hilfe mal nachgesehen und da stand immerhin wie ich funktionen definiere aber mein prob konnte ich immer noch nicht lösen. das prob ist nämlich das ich nen fehler 'Declaration expected.' in der zeile habe wo 'photosload()' stzeht ( also der funktionsaufruf ).warum funzt des ned?
ich bin immer noch vb net anfänger, und ich weiss ned ob der codeschnipsel euch reicht das prob zu lösen. wenn ihr mehr infos braucht, einfach nur fragen.

mf_2
2005-08-26, 14:00:22
hat sich erledigt

mf_2
2005-08-27, 20:27:48
so, ich hab wieder ein probelm: das bild wird ja jetzt so geladen:

Dim photoname As String
Dim photosize As String
photoname = "http://server/bild.jpg"
Dim request As WebRequest
request = WebRequest.Create(photoname)
' If required by the server, set the credentials.
request.Credentials = CredentialCache.DefaultCredentials
' Get the response.
Dim response As HttpWebResponse = CType(request.GetResponse(), HttpWebResponse)
' Get the stream containing content returned by the server.
Dim dataStream As Stream = response.GetResponseStream()
photosize = dataStream.Length
MsgBox(photosize)
Dim imagenew As Bitmap
imagenew = Image.FromStream(dataStream)
' Display the content.
pboxPhoto.Image = imagenew


wie ihr seht, versuche ich irgdnwie die länge der datei herauszufinden, mit photosize, aber es klappt ned. ich brauch die länge, weil ich ne progress bar erstellen will, die die dauer des ladens der datei abschätzen soll ( anhand deren grösse ).

Juerg
2005-08-27, 21:01:16
Wie wärs damit... ;)

Dim MySize As Long
MySize = FileLen("TESTFILE") ' Returns file length (bytes).

mf_2
2005-08-27, 21:31:17
geht das auch für bilder aus dem http? bei mir gibt er dann immer ne fehlremeldung 'file not found', aber wenn ich die url dann aus der fehlermedlung rauskopiere ( tippfehler ausgeschlossen ) und in den IE einfüge, spuckt er das bild anstandslos aus.

mf_2
2005-08-28, 00:34:25
ich habs jetzt so hinbekommen:



Dim photoname As String
Dim photosize As String
photoname = "http://server/bild.jpg"
Dim request As WebRequest
request = WebRequest.Create(photoname)
' If required by the server, set the credentials.
request.Credentials = CredentialCache.DefaultCredentials
' Get the response.
Dim response As HttpWebResponse = CType(request.GetResponse(), HttpWebResponse)
' Get the stream containing content returned by the server.
Dim dataStream As Stream = response.GetResponseStream()
photosize = response.ContentLength
MsgBox(photosize)
Dim imagenew As Bitmap
imagenew = Image.FromStream(dataStream)
' Display the content.
pboxPhoto.Image = imagenew



Aber. Wie kann ich jetzt die progressbar dynamisch updaten? ich weiss was das minimum ist ( 0 ), das maximum ist die grösse von contentlength und wenn man zehn steps ( quadrate ) in der bar hat, dann wird es alle contentlength/10 bytes um ein quadrat geupdatet. wie kann ich das aber machen dass der das dann auch wirklich updatet?

mf_2
2005-08-29, 18:46:59
weiss keiner rat?