 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 22.12.2010, 11:34 Titel: |
|
|
Ja, mit ALLOCATE wird es einfacher.
Code: | Screen 18, 32
Dim PicBfr As UByte Ptr = ImageCreate(100, 100, -1, 32)
Dim As Integer PicLen, ff
''->Irgendwas in den Image zeichnen
Randomize Timer
For ff = 1 To 25
Circle PicBfr,(Rnd*100, Rnd*100), Rnd*20, Rnd*&Hffffff,,,, F
Next
Put(10, 50),PicBfr
ImageInfo PicBfr,,,,,, PicLen
ff = FreeFile
Open "sff.dat" For Binary Access Write As #ff 'nur schreiben
Put #ff,, PicLen
Put #ff,, *PicBfr, PicLen
Close #ff
ImageDestroy(PicBfr)
'Sleep
Dim PicBfrx As UByte Ptr
Dim As Integer PicLenx
ff = FreeFile
Open "sff.dat" For Binary Access Read As #ff 'nur lesen
Get #ff,, PicLenx
PicBfrx = Allocate(PicLenx)
Get #ff,, *PicBfrx, PicLenx
Close #ff
Put (120, 50),PicBfrx
ImageDestroy(PicBfrx)
Sleep | Ich hab die Imagepointer gleich als BYTE PTR angelegt, das erspart CAST Anweisungen und stört nicht bei IMAGECREATE.
Da das zweite Image eine Kopie des ersten ist sollte IMAGEDESTROY ohne weiteres funktionieren. _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
d1rty.h4rry

Anmeldungsdatum: 05.10.2006 Beiträge: 116 Wohnort: Cassel
|
Verfasst am: 22.12.2010, 15:29 Titel: |
|
|
@volta.
Jawoll es funzt, habe es gestern auch getestet. Ich werde es aber dennoch nicht so lösen können und bei imagecreate bleiben müssen. Weil imagedestroy damit eben leider nicht funktioniert. Ich weiß nicht woran es lag. Vllt weil allocate eine c-lib ist oder andere bereiche des rams benutzt. Jedenfalls war der speicher nach dem imageidestroy immernoch belegt. Nach nem deallocate war er frei. Ich müsste also noch eine variable anlegen, die speichert, was für ein pointer es ist. Es sei denn deallocate funzt auch bei imagecreate ptr. Dann würde es anders aussehen. Muss ich später noch einmal testen.
gruß
d1rty h4rry _________________ "Das Fernsehen ist so etwas wie eine geistige Neutronenbombe, das Gehirn wird weggestrahlt. Nur der Kopf bleibt da!" -Olliver Kalkhofe
-> http://fernsehkritik.tv/tv-magazin/
"Wenn alle Stricke reißen, dann häng ich mich auf", Karl Kreiss  |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 22.12.2010, 16:15 Titel: |
|
|
Caste es halt auf nen void* und dealloziere es. |
|
Nach oben |
|
 |
XOR
Anmeldungsdatum: 23.07.2010 Beiträge: 161
|
Verfasst am: 22.12.2010, 19:11 Titel: |
|
|
@d1rty.h4rry
Habe es gerade selbst ausprobiert, wenn man mit Allocate einen speicher erzeugt muss man ihn auch wieder mit DeAllocate entfernen und ImageCreate mit ImageDestroy.
Warum benutzt du dann nicht einfach DeAllocate?
@28398
Bei DeAllocate ist es egal was fuer ein Type angegeben wird, hauptsache ist, dass der Zeiger derselbe ist, den du mit Allocate bekommen hast. |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 22.12.2010, 19:44 Titel: |
|
|
Hi,
ich habe schon geahnt daß da noch ein Haken steckt.
Gut, wenn du nur IMAGEDESTROY benutzen möchtest:
Code: | Screen 18, 32
Dim As Integer PicLen, ff
Dim PicBfr As UByte Ptr = ImageCreate(100, 100, -1, 32)
''->Irgendwas in den Image zeichnen
Randomize Timer
For ff = 1 To 25
Circle PicBfr,(Rnd*100, Rnd*100), Rnd*20, Rnd*&Hffffff,,,, F
Next
Put(10, 50),PicBfr
ImageInfo PicBfr,,,,,, PicLen
ff = FreeFile
Open "sff.dat" For Binary Access Write As #ff 'nur schreiben
Put #ff,, *PicBfr, PicLen
Close #ff
ImageDestroy(PicBfr)
Dim PicBfrx As UByte Ptr
Dim As Integer PicLenx, w ,h
ff = FreeFile
Open "sff.dat" For Binary Access Read As #ff 'nur lesen
Get #ff, 9, w'Breite
Get #ff,13, h'Höhe
PicBfrx = ImageCreate(w, h)
ImageInfo PicBfrx,,,,,, PicLenx
Get #ff,1, *PicBfrx, PicLenx
Close #ff
Put (120, 50),PicBfrx
ImageDestroy(PicBfrx)
Sleep | Alternativ...
Code: | ...
Dim PicBfrx As UByte Ptr = ImageCreate(1, 1)
Dim As Integer PicLenx, w ,h
ff = FreeFile
Open "sff.dat" For Binary Access Read As #ff 'nur lesen
Get #ff,1, *PicBfrx, 32
ImageInfo PicBfrx,w,h,,,, PicLenx
PicBfrx = ImageCreate(w, h)
Get #ff,1, *PicBfrx, PicLenx
Close #ff
Put (120, 50),PicBfrx
ImageDestroy(PicBfrx)
Sleep |
_________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
XOR
Anmeldungsdatum: 23.07.2010 Beiträge: 161
|
Verfasst am: 22.12.2010, 20:25 Titel: |
|
|
@volta
Zitat: |
Alternativ...
Code: |
Dim PicBfrx As UByte Ptr = ImageCreate(1, 1)
Dim As Integer PicLenx, w ,h
ff = FreeFile
Open "sff.dat" For Binary Access Read As #ff 'nur lesen
Get #ff,1, *PicBfrx, 32
ImageInfo PicBfrx,w,h,,,, PicLenx
PicBfrx = ImageCreate(w, h)
Get #ff,1, *PicBfrx, PicLenx
Close #ff
Put (120, 50),PicBfrx
ImageDestroy(PicBfrx)
Sleep
|
|
Aus
Code: |
ImageInfo PicBfrx,w,h,,,, PicLenx
PicBfrx = ImageCreate(w, h)
|
wird
Code: |
ImageInfo PicBfrx,w,h,,,, PicLenx
ImageDestroy(PicBfrx)
PicBfrx = ImageCreate(w, h)
|
ansonsten ist der erste speicher immernoch reserviert.
Aber er will die datei aber auch ohne ein geoeffnetes Fenster auslesen koenen. Mit ImageCreate bekommt er das nicht hin.
Auslesen der datei ohne geoeffnetes Fenster
Code: |
#Undef ImageCreate
#Undef ImageDestroy
Declare Function ImageCreate(ByVal ImageWidth As Integer, ByVal ImageHight As Integer, _
ByVal ImageColor As UInteger = 0, ByVal ImageDepht As Integer = 32) As Any Ptr
Declare Sub ImageDestroy(ByVal ImagePointer As Any Ptr)
Screen 18, 32
Dim As Integer PicLen, ff
Dim PicBfr As UByte Ptr = ImageCreate(100, 100, -1, 32)
''->Irgendwas in den Image zeichnen
Randomize Timer
For ff = 1 To 25
Circle PicBfr,(Rnd*100, Rnd*100), Rnd*20, Rnd*&Hffffff,,,, F
Next
Put(10, 50),PicBfr
ImageInfo PicBfr,,,,,, PicLen
ff = FreeFile
Open "sff.dat" For Binary Access Write As #ff 'nur schreiben
Put #ff,, PicLen
Put #ff,, *PicBfr, PicLen
Close #ff
ImageDestroy(PicBfr)
sleep
Screen 0
Dim PicBfrx As UByte Ptr
Dim As Integer PicLenx
ff = FreeFile
Open "sff.dat" For Binary Access Read As #ff 'nur lesen
get #ff,1, PicLenx
PicBfrx = Allocate(PicLenx)
Get #ff,, *PicBfrx, PicLenx
Close #ff
Screen 18, 32
Put (120, 50),PicBfrx
ImageDestroy(PicBfrx)
Sleep
end
Function ImageCreate(ByVal ImageWidth As Integer, ByVal ImageHight As Integer, _
ByVal ImageColor As UInteger = 0, ByVal ImageDepht As Integer = 32) As Any Ptr
Dim ImageBuffer As Any Ptr
Dim bpp As UByte = 4
ImageBuffer = Allocate(32 + ( ImageHight * (( ImageWidth * bpp + 15 ) AND -16 )))
Cast(UInteger Ptr,ImageBuffer)[0] = 7
Cast(Integer Ptr,ImageBuffer)[1] = bpp
Cast(UInteger Ptr,ImageBuffer)[2] = ImageWidth
Cast(UInteger Ptr,ImageBuffer)[3] = ImageHight
Cast(UInteger Ptr,ImageBuffer)[4] = (( ImageWidth * bpp + 15 ) AND -16 )
If bpp = 4 Then
For i As UInteger = 0 To ImageHight * (( ImageWidth * bpp + 15 ) AND -16 )/4-1
Cast(UInteger Ptr,ImageBuffer)[8+i] = ImageColor
Next
EndIf
Return ImageBuffer
End Function
Sub ImageDestroy(ByVal ImagePointer As Any Ptr)
DeAllocate(ImagePointer)
End Sub
|
|
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|