PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Visual Basic 08 Warten bis pictureBox geladen.


Geldmann3
2011-07-12, 23:22:16
Hallo, ich schreibe hier gerade ein Programm. Folgendes soll ausgeführt werden.

PictureBox1.ImageLocation = TextBox1.Text
Warte bis das Bild angezeigt wird.
MsgBox "Du kannst PictureBox1 jetzt sehen!"

Wie schaffe ich es, dass gewartet wird, bis das Bild geladen ist und der Code dann erst weiter ausgeführt wird.

Monger
2011-07-12, 23:26:57
Die PictureBox Klasse hat ein "LoadCompleted" Event.

Die einfachste Variante ist, was auch immer du an ausführbarem Code danach machen willst, in den Event Handler von eben diesem Event zu schreiben.

Geldmann3
2011-07-12, 23:38:50
Das habe ich bisher immer so gemacht, doch hier kann ich das nicht mehr verwenden. Denn der weitere Code wird die PictureBox unter anderem kontinuirlich mit neuen Bildern befüllen. Was zur Folge hat, dass erst gar kein Bild vollständig angezeigt wird.
Es sei denn, ich stoppe ihn, bis die PictureBox geladen ist.

So geht es nicht
System.Threading.Therad.Sleep(5000)
Denn die PictureBox ist im selben Thread weshalb sie dann ebenfalls schläft. Ausserdem dauert das Anzeigen immer je nach Größe des Bildes unterschiedlich lange.
Edit:
Habe das Problem erst mal mit verschiedenen Threads gelöst. Trotzdem könnte eine Lösung hilfreich sein.

Marscel
2011-07-12, 23:49:30
LoadProgressChanged?

Geldmann3
2011-07-12, 23:59:47
Nee

Monger
2011-07-13, 00:03:45
Das habe ich bisher immer so gemacht, doch hier kann ich das nicht mehr verwenden. Denn der weitere Code wird die PictureBox unter anderem kontinuirlich mit neuen Bildern befüllen.

Wie genau meinst du das? Was versuchst du zu tun? Soll das Bild alle paar Sekunden wechseln, oder...?
Das wäre jetzt wichtig zu wissen, bevor wir da über Lösungen fabulieren.

Geldmann3
2011-07-13, 00:33:37
For each blablabla
-Das Bild wird geladen.
-Wenn es in der PictureBox ist kann ich es in dieser Analysieren. Zum Beispiel Auflösung ermitteln. (Dafür muss es aber durch-geladen sein)
-Anschließend wird es je nach Ergebnis an eine andere Stelle kopiert.
-Jetzt wird das nächste Bild geladen.
Next

Das ganze Massenhaft.

Marscel
2011-07-13, 01:27:43
Ich hab weder von VB noch von deiner Anwendung einen Plan, deswegen auch Pseudo-Code, wie ichs angehen würde:

Initialisierung:

(Integer) currentPicture = 0
(Strings) picutreList = { ... }
PictureBox1.LoadCompleted += AsyncCompletedEventHandler(pictureCallback)
nextPicture()

Ladefunktion:
nextPicture() {
(Integer) i = currentPicture
// Validierung und so
// currentPicture hier inkrementieren
PictureBox1.ImageLocation = pictureList[i]
}

Callback:
pictureCallback(sender, eventParams) {
// hier dein Bild behandeln
nextPicture()
}

Ich weiß nicht, in welchem Thread ein AsyncCompletedEventHandler läuft, wenn er da meckert wegen Zugriffsverletzung auf PictureBox1, nextPicture() mittels Invoke-Funktion aufrufen.

Monger
2011-07-13, 14:50:15
-Wenn es in der PictureBox ist kann ich es in dieser Analysieren. Zum Beispiel Auflösung ermitteln. (Dafür muss es aber durch-geladen sein)

Verwendest du irgendwas speziell in der PictureBox Klasse, außer dem Image Attribut?

Weil Größe und Auflösung kannst du auch ohne PictureBox direkt über Image herausfinden. Das wäre nicht nur um Welten schneller (rendern ist halt immer langsam), sondern auch deutlich einfacher zu programmieren.

TheGamer
2011-07-13, 14:57:53
Dafür muss es aber durch-geladen sein

Nein. Und dafuer brauchts keine Picture Box

Geldmann3
2011-07-13, 16:00:10
Verwendest du irgendwas speziell in der PictureBox Klasse, außer dem Image Attribut?
Weil Größe und Auflösung kannst du auch ohne PictureBox direkt über Image herausfinden. Das wäre nicht nur um Welten schneller (rendern ist halt immer langsam), sondern auch deutlich einfacher zu programmieren.
Kannst du mir ein Codebeispiel nennen?
Vielen Dank, das wusste ich gar nicht. Jetzt bin ich wohl nicht mehr abhängig von der Picture Box.:rolleyes:
Die nutze ich dann nur noch zur Vorschau.

PatkIllA
2011-07-13, 18:25:02
Wo kommen die Bilder denn her? Webaddresse?
Und was willst analysieren? Für die Auflösung brauchst du nur ein paar Bytes zu lesen.

Geldmann3
2011-07-13, 20:25:26
Die Auflösung ist das wichtigste. Die Bilder kommen von der Platte.

TheGamer
2011-07-14, 08:55:05
Die Auflösung ist das wichtigste. Die Bilder kommen von der Platte.

string imageFile = @"C:\Users\Public\Pictures\Sample Pictures\Koala.jpg";
using (Image image = Image.FromFile(imageFile))
{
int width = image.Width;
int height = image.Height;
float horizontalResolution = image.HorizontalResolution;
float verticalResolution = image.VerticalResolution;
}

Der Rest von den Properties darfst du anhand der Dokumentation herausfinden.

Geldmann3
2011-07-14, 09:26:00
Danke, hat mit sehr weitergeholfen.

Bald (Nächsten Tage/Wochen)werde ich das Programm hier mal zum Download anbieten. (Wenn vorzeigbar)

Es analysiert Bilder, anhand der Auflösung und einzelnen Bildpunkten und komprimiert diese dann "möglichst" optisch verlustfrei ins .jpg Format. Sodass ein möglichst gutes Verhältnis Qualität/Dateigrößen entsteht.
Bei der Komprimierung wird versucht zu erkennen ob Artefakte entstehen, wenn ja, wird dort prozedural eine höhere BQ angewandt.

Desktopaufnahmen oder ähnliches sollen automatisch erkannt werden und verlustfrei (png) komprimiert werden.

Ist aber noch unkalkulierbar viel Arbeit bis zur 1.0 final :wink:

PatkIllA
2011-07-14, 11:03:55
Dann solltest du aber schon noch ein paar Bibliotheken zur Rate ziehen.
Die Standard .NET Bibliotheken bieten quasi keine Möglichkeiten die Kompression zu beeinflussen. Und gerade Artefakteerkennung und Bildanalyse sollte man aus Geschwindigkeitsgründen eher lowlevel auf Speicherebene machen, wenn man eine halbwegs akzeptable Geschwindigkeit erreichen will.
Und die Idee ein Control zur Bestimmung der Auflösung eines Bildes heranzuziehen klingt jetzt für mich danach, dass du gerade erst in die Programmierung einsteigst.

Geldmann3
2011-07-14, 11:58:16
Im Grundsatz funktioniert es bereits. 1 Bild zu komprimieren dauert aber im Schnitt ca. 0,5 Sekunden was bei 100 Bildern 50 Sekunden bei 1000 sogar 8:20 Minuten sind.
Aber wann hat man schon mal 1000 Bilder. Vielleicht wenn man eine gesamte Speicherkarte mit Fotos auf einmal komprimieren möchte...

Eigentlich bin ich erst mal froh, dass es grundsätzlich funzt.

Zur Kompression verwende ich momentan ImageMagick (http://www.imagemagick.org/script/index.php) als Plugin.