Forum: Mikrocontroller und Digitale Elektronik c# Screenshot auf Windows CE Gerät


von Peter (Gast)


Lesenswert?

Hi. Ich habe hier ein Gerät, das mit Windows CE 6 läuft.
Ich möchte gerne vom Bildschirm Screenshots erstellen.
Dazu gibt es c# Codebeispiele im Internet. Das bisher einzige, was bei 
mir funktioniert, ist dieses:
1
using System;
2
using System.Collections.Generic;
3
using System.IO;
4
using System.Runtime.InteropServices;
5
using System.Windows.Forms;
6
using System.Drawing;
7
using System.Drawing.Imaging;
8
9
namespace ScreenShot
10
{
11
    public class Program
12
    {
13
        enum RasterOperation : uint { SRC_COPY = 0x00CC0020 }
14
15
        [DllImport("coredll.dll")]
16
        static extern int BitBlt(IntPtr hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, RasterOperation rasterOperation);
17
18
        [DllImport("coredll.dll")]
19
        private static extern IntPtr GetDC(IntPtr hwnd);
20
21
        [DllImport("coredll.dll")]
22
        private static extern int ReleaseDC(IntPtr hwnd, IntPtr hdc);
23
24
        static void Main(String[] args)
25
        {
26
            Rectangle bounds = Screen.PrimaryScreen.Bounds;
27
            IntPtr hdc = GetDC(IntPtr.Zero);
28
            Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height, PixelFormat.Format16bppRgb565);
29
            using (Graphics graphics = Graphics.FromImage(bitmap))
30
            {
31
                IntPtr dstHdc = graphics.GetHdc();
32
                BitBlt(dstHdc, 0, 0, bounds.Width, bounds.Height, hdc, 0, 0,
33
                RasterOperation.SRC_COPY);
34
                graphics.ReleaseHdc(dstHdc);
35
            }
36
            bitmap.Save("screenshot.jpg", ImageFormat.Jpeg);
37
            ReleaseDC(IntPtr.Zero, hdc);
38
        }
39
    }
40
}

Das Problem ist, dass der code relativ langsam ist. Wenn ich ihn z.B. 
alle 250ms aufrufe, reagiert das Gerät relativ träge. Hat jemand eine 
Idee wie man das optimieren könnte?

Gruß Peter

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Peter schrieb:
> reagiert das Gerät relativ träge.
Welche Rechenleistung hat "das Gerät"?

Gibt es für "das Gerät" einen brauchbaren Bildschirmtreiber, oder muss 
BitBlt() jedes einzelne Pixel per Handschlag hin- und herkopieren.

von Peter (Gast)


Lesenswert?

Die Verzögerung kommt vom Speichern des Bildes. Dann hab ich nen 
Ansatzpunkt wo ich optimieren kann.

von Peter (Gast)


Lesenswert?

Lothar M. schrieb:
> Welche Rechenleistung hat "das Gerät"?

Ca. 1Ghz.

Lothar M. schrieb:
> Gibt es für "das Gerät" einen brauchbaren Bildschirmtreiber

Weiß ich nicht. Keine Ahnung wo man das nachgucken kann.

Der Plan war eigentlich das Bild zu Diagnosezwecken zu speichern und 
dann per Ethernet weiter zu schicken, aber dann verzichte ich aufs 
Speichern und sende es direkt.

von Luther B. (luther-blissett)


Lesenswert?

Windows CE 6? Dann könnte die verwendete Hardware sehr alt und langsam 
sein und möglicherweise gibt es auch keine Hardwareunterstützung fürs 
JPEG-komprimieren.

probiere mal, wie es sich auswirkt, wenn du diese Zeile auskommentierst:

    bitmap.Save("screenshot.jpg", ImageFormat.Jpeg);

Falls das weniger träge ist, dann probiere mal andere Bildformate:

    bitmap.Save("screenshot.bmp", ImageFormat.Bmp);

oder

    bitmap.Save("screenshot.gif", ImageFormat.Gif);

oder

    bitmap.Save("screenshot.tif", ImageFormat.Tiff);

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Peter schrieb:
> Die Verzögerung kommt vom Speichern des Bildes.
Wohin wird das Bild gespeichert?

von Schlaumaier (Gast)


Lesenswert?

Peter schrieb:
> Hat jemand eine
> Idee wie man das optimieren könnte?

Win-CE ist eh eine tote und lahmes System.

Davon abgesehen. Wie schnell ist die SD-Karte falls es eine hat. Die 
Win-CE Teile die ich kenne haben die lahmen CF-Karten.

Davon abgesehen. Bist du sicher das das JPG-Dateien sind. ?? Bitsave 
lässt i.d.R. auf BMP Dateien schließen. Schau dir mal den Hex-Code des 
Bildes an.

Wenn es JPG ist, muss die Bitmap in ein komprimiertes JPG umgewandelt 
werden. Und da die Kisten wie gesagt nicht die schnellsten sind....

Bei BMP (was ich glaube) ist die Datenmenge relativ hoch, und das muss 
auf eine lahme Karte.


Alles in allen sind 250ms  viel zu kurz. Da hängt den Teil die Zunge aus 
den Hals.

von Peter (Gast)


Lesenswert?

Luther B. schrieb:
> Falls das weniger träge ist, dann probiere mal andere Bildformate:

Als bmp ist es auch träge, und das Bild kann nicht betrachtet werden.

Als Gif ist es erträglich, jedoch sind unten leichte 
Bildfehler/Artefakte am Rand.

Tiff lässt sich nicht kompilieren.
"System.Drawing.Imaging.ImageFormat" enthält keine Definition für 
"Tiff". (CS0117)

von Peter (Gast)


Lesenswert?

Schlaumaier schrieb:
> Alles in allen sind 250ms  viel zu kurz. Da hängt den Teil die Zunge aus
> den Hals.

Ja, ich schätze auch ich muss mir was anderes überlegen.
Aber per Screenshot wäre es am wenigsten Arbeit gewesen.

von J. S. (jojos)


Lesenswert?

vielleicht findet man einen VNC Server für WinCE?
Ist das Pixelformat RGB565 auch das was nativ auf dem Gerät läuft? Nicht 
das da noch eine langsame Konvertierung stattfindet.

von Peter (Gast)


Lesenswert?

J. S. schrieb:
> vielleicht findet man einen VNC Server für WinCE?

Was ich kenne ist ein Programm namens CERDISP. Das ist jedoch nur für 
Verbindungen zwischen Windows CE und Windows XP/7 ausgelegt. Das fällt 
bei mir flach.

J. S. schrieb:
> Ist das Pixelformat RGB565 auch das was nativ auf dem Gerät läuft?

Gute Frage, keine Ahnung.

von Stefan F. (Gast)


Lesenswert?

4 Screenshots pro Sekunde machen und per Netzwerk zu übertragen klingt 
für mich nach einem Fall für RDP oder VNC.

von c-hater (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> 4 Screenshots pro Sekunde machen und per Netzwerk zu übertragen klingt
> für mich nach einem Fall für RDP oder VNC.

Tja, das Problem ist halt bloß, dass CE keinen RDP-Server eingebaut hat 
und VNC letztlich dasselbe machen muss, was er da tut (bzw. der von ihm 
zusammengeklaute Code).

Das eigentliche Problem ist aber, das CE uralt ist und auf alten Geräten 
mit geringen Reserven bei Rechenleistung und insbesondere Busbandbreite 
läuft. Das sind einfach keine guten Voraussetzungen für Screen-Kopien.

Peter schrieb:

> J. S. schrieb:
>> Ist das Pixelformat RGB565 auch das was nativ auf dem Gerät läuft?

> Gute Frage, keine Ahnung.

Das wäre aber wichtig, denn das ist so ziemlich das einzige, wo 
eventuell noch etwas herauszuholen wäre. Allerdings ist RGB565 
tatsächlich ein sehr verbreitetes Pixelformat bei WindowsCE-Geräten, es 
ist also recht wahrscheinlich, dass das schon so passt, also auch hier 
nix mehr zu verbessern geht.

von Keks F. (keksliebhaber)


Lesenswert?

Verstehe die Raterei nicht.
Laufzeiten lassen sich extern oder im Code messen und entsprechend 
auswerten.
Führe Messungen durch und teile die Werte. Dann kann man zielgerichtet 
optimieren.

Pauschal kann man nur sagen, wenn die Gesamtheit des Codes langsam ist, 
den weniger häufig auszuführen, oder schnellere Hardware zu benutzen.
Dazu sagst du auch noch, "das Gerät reagiert relativ träge". Das ist 
auch ein komplett anderes Problem.
Ich denke hier wird nur ein Bruchteil des Codes gezeigt.

: Bearbeitet durch User
von db8fs (Gast)


Lesenswert?

Was du machen kannst, falls das nicht schon der Fall ist: die Screenshot 
versuchen ins Ram-Filesystem zu legen und nicht auf den Flash, das 
könnte vielleicht was bringen.

Den Tipp mit dem Pixelformat-Konvertierung finde ich auch sehr wichtig, 
manchmal haben die CE-Teile auch 5551 oder solche exotischen Sachen 
verbaut.

Ansonsten kommt's wahrscheinlich auch drauf an, wie schnell solche 
Speicheroperationen an sich sind, denn wenn der RAM nicht viel 
Geschwindigkeit hergibt, musst du eben dann damit leben.

von db8fs (Gast)


Lesenswert?

Schlaumaier schrieb:
> Win-CE ist eh eine tote und lahmes System.

Das System selber ist schnell, denk ich. Gebootet haben die Dinger 
meistens schneller als ein relativ moderner Raspberry mit Raspbian 
drauf.

Das übel lahme sind meistens die Flash-Speicher, die auch dazumal 
ziemlich fix durchgeschrieben worden sind, das mit dem Flash-Schonen ist 
später erst Mode geworden glaube ich.

> Davon abgesehen. Wie schnell ist die SD-Karte falls es eine hat. Die
> Win-CE Teile die ich kenne haben die lahmen CF-Karten.

Das stimmt, SD kann noch schlimmer als der Flash sein, aber selbst der 
ist lichtjahre-weit von den SSDs heute entfernt...

> Davon abgesehen. Bist du sicher das das JPG-Dateien sind. ?? Bitsave
> lässt i.d.R. auf BMP Dateien schließen. Schau dir mal den Hex-Code des
> Bildes an.

Wenns BMP wäre, würde das sogar noch schneller gehen vermutlich. Einfach 
weil nix mehr komprimiert werden muss. Bei 16bit und 640x480 biste bei 
~0.5MB pro Bild, das könnte helfen. Wenns nicht gerade ein 
FullHD-Display ist ^^

> Alles in allen sind 250ms  viel zu kurz. Da hängt den Teil die Zunge aus
> den Hals.

Zeichnen in 3Hz bei 640x480 sollte auf den Dingern locker möglich sein 
mit Double-Buffering, selbst bei nem steinalten 200Mhz ARM ohne FPU und 
alles geht das. Ob das Grabben aus dem Videomemory viel langsamer ist, 
glaub ich nicht, oft ist bei den CE-Dingern ein gemeinsamer Speicher, wo 
8MB für Grafik abgezwackt werden.

von Achim M. (minifloat)


Lesenswert?

Was hat DerGerät denn für einen Ausgang für seinen Bildschirm? Eventuell 
kann man das abgreifen und mit einem modernen Einplatinenrechner "auf 
RJ45 konvertieren"?

mfg mf

von Peter (Gast)


Lesenswert?

Danke für die hilfreichen Antworten!
Ich werde mal was einbauen um die Zeiten zu messen.
Und ich werde versuchen das Bild direkt aus dem RAM per Ethernet 
weiterzusenden.

von Schlaumaier (Gast)


Lesenswert?

Naja. Das einzige Gerät mit Win-CE 6.0 was ich je hatte, war ein 
HP-5450.

Und das war /ist ein Pocket-PC. Der Vorgänger eines Smartphone. Falls es 
Leute gibt die die Teile nicht kennen.

Und der war damals schon nicht der schnellste. Trotz 1 GB CF-Karte.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.