Autor Beitrag
P4o3n1x
Hält's aus hier
Beiträge: 7

Win XP, Kubuntu 8.04
C#, Java, Delphi
BeitragVerfasst: Fr 06.03.09 20:09 
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:

ausblenden 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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: www.vbforums.com/showthread.php?t=358917 (das unsafe ist allerdings Quatsch, sollte sich einfach entfernen lassen).

_________________
>λ=
P4o3n1x Threadstarter
Hält's aus hier
Beiträge: 7

Win XP, Kubuntu 8.04
C#, Java, Delphi
BeitragVerfasst: 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:

ausblenden 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!