Entwickler-Ecke
IO, XML und Registry - Probleme mit Image.FromStream
P4o3n1x - Fr 06.03.09 20:09
Titel: Probleme mit Image.FromStream
Hallo,
ich versuche ein Applet für ein extern angeschlossenes Display zu schreiben. Ich setze auf eine Linklibrary auf, die mir lediglich erlaubt Bilder in Form eines Byte-Arrays an das Display zu senden.
Ich möchte nun gerne dem aktuellen Display einen Text hinzufügen und habe hierfür folgenden Quelltext geschrieben:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| private void drawString(string text, int x, int y) { MemoryStream ms = new MemoryStream(buf); Image img = Image.FromStream(ms); Graphics g = Graphics.FromImage(img); g.DrawString(text, new Font("Sans Serif", 1), new SolidBrush(Color.Red), x, y); img.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp); buf = ms.ToArray(); for (int i = 0; i < 160 * 43; i++) if (buf[i] > PIXEL_OFF) buf[i] = PIXEL_ON; } |
Dies ist zwar kompilierbar, jedoch bekomme ich einen Laufzeitfehler in Zeile 4, mit der Fehlermeldung, dass ein falscher Parameter angegeben sei. buf ist folgenderweise deklariert:
C#-Quelltext
1: 2:
| byte[] buf = new byte[160 * 43]; for(int i = 0; i < 160 * 43; i++) buf[i] = 0; |
Für Hilfe wäre ich sehr dankbar, auch nehme ich gerne Vorschläge an, das ganze geschickter zu gestalten, da mir das Hin- und herkonvertieren zwischen Byte-array und Image doch sehr kompliziert erscheint.
Kha - Fr 06.03.09 22:42
:welcome:
Da du ja nur Daten an das Display sendest, sollte doch die Richtung Bitmap->byte[] genügen, oder? Dazu solltest du dir LockBits anschauen, wie z.B. hier:
http://www.vbforums.com/showthread.php?t=358917 (das
unsafe ist allerdings Quatsch, sollte sich einfach entfernen lassen).
P4o3n1x - So 08.03.09 01:29
Dankeschön für deine Antwort - sie hat mich sehr weitergebracht.
Ich bin nun, wie du empfohlen hattest, auf die Arbeit mit Bitmaps umgestiegen und konvertiere nur noch vor Senden an das Display in Byte-Array-Format.
Der Quelltext den du verlinkt hast, funktionierte leider nicht gewünscht, da große Lücken zwischen gezeichneten Pixeln auftauchten. Ich habe allerdings nach Internetrecherche einen Workaround hierfür gefunden, da es sich anscheinend um ein Hardwareseitiges Problem handelt. Der Code den ich nun zur Konvertierung verwende lautet:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| byte pixelValue; byte[] buf = new byte[DispWidth * DispHeight]; for (int i = 0; i < DispHeight; ++i) for (int j = 0; j < DispWidth; ++j) { pixelValue = bitmap.GetPixel(j, i).G; buf[j + (i * DispWidth)] = pixelValue; } |
Funktioniert. Danke für die Hilfe!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!