c# Screenshot auf Windows CE Gerät

Gast #7164870
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
Gast #7164904
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.
#7164905
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);
Gast #7164921
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.
Gast #7164926
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)
Gast #7165120
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.
#7165143
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.
Gast #7165159
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.
Gast #7165185
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.
Gast #7167643
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren