Entwickler-Ecke
Multimedia / Grafik - Screenshot unabhängig von Auflösung machen
HenryHux - Di 14.12.10 20:12
Titel: Screenshot unabhängig von Auflösung machen
Hi,
ich mache Screenshots von Bildausschnitten und vergleiche diese mit schon vorher aufgenommenen Bildern in Ressourcendateien.
Soweit so gut.
Doch jetzt will ich es unabhängig von der Auflösung machen, denn ein Screenshot bei mir (1920*1080) fällt anders aus als bei anderen (z.B 1920*1200). Kann ich das irgendwie komplett Auflösungsunabhängig gestalten, oder muss ich für jede Bildschirmauflösung einzeln alles einstellen?
Hier mal die Funktion:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34:
| procedure Screenshot(Bounds:TRect; Links, Rechts, Oben, Unten : Integer); inline; var DeskCanvas: TCanvas; ShotTargetBitmap : TBitmap; Cut : TRect; begin try TBmp:=TBitmap.Create; bounds.left:=bounds.Left+verschiebenx; bounds.right:=bounds.right+verschiebenx; bounds.top:=bounds.top+verschiebeny; bounds.bottom:=bounds.bottom+verschiebeny; try DeskCanvas := TCanvas.Create; DeskCanvas.Handle := GetDC(0); Shottargetbitmap:=TBitmap.create; ShotTargetbitmap.Width := Round((Bounds.Right - Bounds.left) * 1); ShotTargetbitmap.Height := Round((Bounds.Right - Bounds.Left) * 1); BitBlt(ShotTargetBitmap.Canvas.Handle, 0 ,0, bounds.Right-bounds.left, bounds.Bottom-bounds.top, DeskCanvas.handle, bounds.Left, bounds.Top, SRCCOPY); Cut.Left := Links; Cut.Top := Oben; Cut.Right := Rechts; Cut.Bottom := Unten; TBmp.Width := Cut.Right - Cut.Left; TBmp.Height := Cut.Bottom - Cut.Top; BitBlt(TBmp.Canvas.Handle, 0, 0, Cut.Right, Cut.Bottom, ShotTargetBitmap.Canvas.Handle, Cut.Left, Cut.Top, SRCCOPY); finally ReleaseDC(0,DeskCanvas.Handle); FreeAndNil(deskcanvas); FreeAndNil(ShotTargetBitmap); end; except FreeAndNil(TBmp); end; end; |
Lg
Henry
Moderiert von
Martok: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Di 14.12.2010 um 19:14
jaenicke - Di 14.12.10 20:24
Ich verstehe gerade nicht was du da einzeln einstellen musst? :gruebel:
HenryHux - Di 14.12.10 20:39
Also wenn ich 2 mal die gleiche Funktion mit den gleichen Parametern starte (also screenshotte und danach schneide), ist zb bei 1920*1080 das Bild kleiner in der Breite, als bei 1920*1200.
Jetzt könnte ich das zwar irgendwie hinbekommen, dass ich das gleiche Bild auch auf ner anderen Auflösung bekomme, ist aber ziemlich umständlich.
Deswegen denke ich ich müsste den Benutzer auffordern seine Auflösung anzugeben bzw ich müsste die auslesen.
Dann müsste ich für jede Auflösung die Parameter :(Bounds:TRect; Links, Rechts, Oben, Unten : Integer) nochmal strecken.
Hoffe das ist soweit verständlich.
Wie gesagt ist das recht umständlich, deswegen wollte ich wissen ob ihr vielleicht einen Weg kennt, mit welchem ich nicht auf die Auflösung achten müsste.
Lg
jaenicke - Di 14.12.10 20:42
HenryHux hat folgendes geschrieben : |
Deswegen denke ich ich müsste den Benutzer auffordern seine Auflösung anzugeben bzw ich müsste die auslesen. |
Naja, auslesen geht direkt über Screen. Da bekommst du eine Liste der Monitore.
HenryHux hat folgendes geschrieben : |
Dann müsste ich für jede Auflösung die Parameter :(Bounds:TRect; Links, Rechts, Oben, Unten : Integer) nochmal strecken. |
Wenn du das Bild auf eine andere Bildschirmauflösung mit einem anderen Seitenverhältnis verzerrst, kannst du den Vergleich doch vergessen. Schließlich ist nicht genauso viel drauf, wenn du z.B. weniger vertikale Pixel hast. :nixweiss:
HenryHux - Di 14.12.10 20:56
Ok, das heißt man kann solche Programme nicht richtig auf anderen Computern laufen lassen, ohne dass ich alle Bilder auf dem anderen Computer neu aufnehmen muss?
Wäre es denn nicht theorethisch möglich, dass ich das aufzunehmende Fenster strecke?
jaenicke - Di 14.12.10 21:37
Ich verstehe nicht wie du dir das vorstellst. Das geht doch rein logisch nicht. :gruebel:
Beispiel:
Ich nehme einen Editor auf 1024x768 Pixeln. Dann passen z.B. 40 Zeilen drauf. Ein anderer Benutzer hat jetzt 1024x600 Pixel. Da passen nur 30 Zeilen drauf. Wenn du jetzt die 40 Zeilen auf 30 verzerrst, wie willst du das dann vergleichen? :nut:
Im Anhang einmal entsprechende Screenshots.
Du kannst eben nur Bildschirmbereiche vergleichen, die dann bei allen Benutzern so sind.
HenryHux - Di 14.12.10 22:13
Ja war nen Logikfehler, das kann so net gehn, danke.
Wie wär es denn wenn ich die Auflösung erzwinge?
Ist ja nur für den Privatgebrauch gedacht, aber ich kriege manche Bildschirme halt nur auf 1920*1200 und nicht auch 1920*1080, denke liegt am Widescreen Format.
Also wenn ich 120 Pixel auf der X Achse "abschneiden" kann, wär das cool :D
Lg
jaenicke - Mi 15.12.10 06:29
HenryHux hat folgendes geschrieben : |
Wie wär es denn wenn ich die Auflösung erzwinge? |
Wie stellst du dir das vor? Auf einem Ultra-Widescreen z.B. wird eine 4:3 Auflösung nicht sinnvoll funktionieren (weil total verzerrt). ;-)
HenryHux hat folgendes geschrieben : |
aber ich kriege manche Bildschirme halt nur auf 1920*1200 und nicht auch 1920*1080, denke liegt am Widescreen Format.
Also wenn ich 120 Pixel auf der X Achse "abschneiden" kann, wär das cool :D |
Naja, du kannst ja beim Erstellen des Screenshots entsprechend angeben was du haben willst.
Aber geht es nicht eigentlich eher um Fensterinhalte?
Oder fangen wir mal anders an: Was willst du mit den Vergleichen denn eigentlich erreichen? Denn ich meine der komplette Bildschirm sieht doch eh bei jedem anders aus. Und auch die einzelnen Fenster aufgrund des Rahmens, etc.
HenryHux - Mi 15.12.10 09:22
Mal wieder überzeugend :D
War wieder ne falsche Planung, ich versuche mal das irgendwie anders zu regeln, so gehts nicht.
Ich meld mich nochmal mit nem neuen Konzept =)
Lg
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 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!