Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

imageCreate bfr in Datei speichern
Gehe zu Seite Zurück  1, 2
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 22.12.2010, 11:34    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
d1rty.h4rry



Anmeldungsdatum: 05.10.2006
Beiträge: 116
Wohnort: Cassel

BeitragVerfasst am: 22.12.2010, 15:29    Titel: Antworten mit Zitat

@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. lächeln
gruß
d1rty happy 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 lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 22.12.2010, 16:15    Titel: Antworten mit Zitat

Caste es halt auf nen void* und dealloziere es.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
XOR



Anmeldungsdatum: 23.07.2010
Beiträge: 161

BeitragVerfasst am: 22.12.2010, 19:11    Titel: Antworten mit Zitat

@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
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 22.12.2010, 19:44    Titel: Antworten mit Zitat

Hi,
ich habe schon geahnt daß da noch ein Haken steckt. mit den Augen rollen
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
XOR



Anmeldungsdatum: 23.07.2010
Beiträge: 161

BeitragVerfasst am: 22.12.2010, 20:25    Titel: Antworten mit Zitat

@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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite Zurück  1, 2
Seite 2 von 2

 
Gehe zu:  
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.

 Impressum :: Datenschutz