Image Grösse im Speicher

Für allgemeine Fragen zur Programmierung mit PureBasic.
traumatic
Beiträge: 478
Registriert: 27.11.2004 15:42

Beitrag von traumatic »

Laurin hat geschrieben: Es scheint keine Möglichkeit zu geben, wie man die sPeicheradresse herausbekommt.
Sofern es nicht um Linux geht: WinAPI -> GetDIBits()

Beispiel (u.a.) hier:
http://robsite.de/php/pureboard/viewtopic.php?t=1164
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Code: Alles auswählen

hbmp = CreateImage(0,100,100)
StartDrawing(ImageOutput())
Plot(0,0,RGB(123,0,0))
StopDrawing()

mem = AllocateMemory(100*100*4)
GetBitmapBits_(hbmp,100*100*4,mem)
Debug Red(PeekL(mem)>>16) ;Nur zum test ob der selbe Rot-Wert wie oben rauskommt
... zu spät ;)

Edit: Obwohl, meine Methode is einfacher..
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

man kann auch den drawing-mode verwenden, nur um den pointer zu ermitteln:

Code: Alles auswählen

StartDrawing(ImageOutput())
*mem = DrawingBuffer()
xwid = DrawingBufferPitch()
StopDrawing()
mit DrawingBufferPitch() kann man die länge einer Zeile in Byte erfragen

@Deem:

ich raff dein beispiel nicht... was ist GetBitmapBits_() denn für ne function???
Andreas21
Beiträge: 390
Registriert: 30.08.2004 09:05
Computerausstattung: Desktop
Windows 10 Pro x64
CPU: AMD Ryzen 5 2600 3.40 GHz
Ram: 16GB RAM
Grafik: NVIDA Geforce 1060
PB: 5.72 X86/X64
Wohnort: Heidelberg

Beitrag von Andreas21 »

Super Danke :-)
Windows 10 x64 Pro - PB 5.61 X64 / x32 - PB 4.6 x32
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag von Laurin »

Das ist ein Befehl der WinAPI.

Dabei wird das Handle zum Bild, dessen Größe und die gewünschte Speicheradresse übergeben. Dann wird das Bild in den Speicher kopiert.


Greetz Laurin
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
Andreas21
Beiträge: 390
Registriert: 30.08.2004 09:05
Computerausstattung: Desktop
Windows 10 Pro x64
CPU: AMD Ryzen 5 2600 3.40 GHz
Ram: 16GB RAM
Grafik: NVIDA Geforce 1060
PB: 5.72 X86/X64
Wohnort: Heidelberg

Beitrag von Andreas21 »

Windows API

The GetBitmapBits function copies the bitmap bits of a specified bitmap into a buffer.

Requires Windows NT 3.1 or later; Requires Windows 95 or later

GDI32

Declare Function GetBitmapBits Lib "gdi32" Alias "GetBitmapBits" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long

· hBitmap
Identifies the bitmap.

· dwCount
Length of the buffer.

· lpBits
Points to a buffer to receive the bitmap data.

Mit SetBitmapBits müste ich eigentlich auch wieder aus einen Ram ein Image zurück kopieren können oder :-)
Windows 10 x64 Pro - PB 5.61 X64 / x32 - PB 4.6 x32
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Kaeru Gaman hat geschrieben:man kann auch den drawing-mode verwenden, nur um den pointer zu ermitteln:

Code: Alles auswählen

StartDrawing(ImageOutput())
*mem = DrawingBuffer()
xwid = DrawingBufferPitch()
StopDrawing()
mit DrawingBufferPitch() kann man die länge einer Zeile in Byte erfragen
Aus der PBHilfe 'DrawingBuffer()': "Diese befindet sich im Videospeicher, wenn die Ausgabe auf ScreenOutput() oder SpriteOutput() erfolgt."
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

@deem

woraus logisch folgt, dass sie sich bei ImageOutput() nicht im Videospeicher befindet.

so what?
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

:freak:

Hast du denn mal deinen Code getestet?

Code: Alles auswählen

CreateImage(0,100,100)
StartDrawing(ImageOutput()) 
*mem = DrawingBuffer() 
Debug *mem
StopDrawing()
Und ich glaube nicht, dass das Bild an Pos. 0 im Speicher ist...
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ok, mea culpa.

ich hatte es nicht getestet.

asche auf mein haupt.

wie konnte ich auch davon ausgehen, dass die anleitung ausnahmsweise
eine vollständige, nicht irreführende aussage macht.
Bild

Gibt die 'SpeicherAdresse' des Zeichenbuffers ("DrawingBuffer") zurück. Diese befindet sich im Videospeicher, wenn die Ausgabe auf ScreenOutput() oder SpriteOutput() erfolgt.
müsste also heissen:
Gibt die 'SpeicherAdresse' des Zeichenbuffers ("DrawingBuffer") zurück, wenn die Ausgabe auf ScreenOutput() oder SpriteOutput() erfolgt. Diese befindet sich im Videospeicher.
Antworten