EncodeImage

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Stevie63
Beiträge: 86
Registriert: 06.05.2009 23:02
Computerausstattung: Win 10, i7, fsc celsius

EncodeImage

Beitrag von Stevie63 »

Hallo zusammen,

bei folgendem Code bricht die Funktion EncodeImage bei ca. 2200 und 2300 ab, d.h. EncodeImage liefert Null zurück. Kann mir hier jemand weiterhelfen?

Vielen Dank im voraus!

Stevie

PB 5.51 (32 Bit !!) (Bei 64bit scheint es zu laufen)

Code: Alles auswählen



EnableExplicit

Structure PictureBuffer
    *ptr
EndStructure

UsePNGImageDecoder()
UsePNGImageEncoder()

Define hDcDesktop.i = GetDC_(GetDesktopWindow_())
Define count.i = 0
Define pic_counter.i = 1
Define stored_pictures.i = 0
Define count.i = 0
Define dest_dx.i = 640
Define dest_dy.i = 400
Define image.i = CreateImage(#PB_Any, 640, 400)
Define min_x.i = 0
Define min_y.i = 0
Define w.i = 1920
Define h.i = 1200
Define hDC.i

Global NewList PicBuffer.PictureBuffer()

While pic_counter < 3000 ; <--- Den Wert variieren
    AddElement(PicBuffer())
    hDC = StartDrawing(ImageOutput(image))
    StretchBlt_(hDC, 0, 0, dest_dx, dest_dy, hDcDesktop, min_x, min_y, w, h, #SRCCOPY)
    StopDrawing()
    PicBuffer()\ptr = EncodeImage(image,#PB_ImagePlugin_PNG)
    If PicBuffer()\ptr = 0
        MessageRequester("Abbruch","PictureBuffer()\ptr = 0. Abbruch bei " + Str(pic_counter) + "Bildern")
        End
    EndIf
    stored_pictures = pic_counter
    pic_counter+1
    count = 0
    Debug pic_counter
Wend

UseZipPacker()
ReleaseDC_(GetDesktopWindow_(),hDcDesktop)
FreeImage(image)
pic_counter = 1 
If CreatePack(0, "c:\temp\files.zip") 
    ForEach PicBuffer()
        AddPackMemory(0, PicBuffer()\ptr, MemorySize(PicBuffer()\ptr), "pic"+ "__"+Str(pic_counter)+".png")
        pic_counter+1
    Next
    ClosePack(0)
EndIf

ForEach PicBuffer()
    FreeMemory(PicBuffer()\ptr)
Next
ClearList(PicBuffer())

Zuletzt geändert von Stevie63 am 18.02.2017 22:36, insgesamt 1-mal geändert.
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: EncodeImage

Beitrag von Kiffi »

keine Ahnung, warum das so ist.

Wenn Du allerdings die Bilder nicht zuerst in eine LinkedList speicherst, sondern direkt nach Erstellen dem ZIP hinzufügst, funktioniert es auch mit 3000 (oder mehr) Bildern:

Code: Alles auswählen

EnableExplicit

Structure PictureBuffer
  *ptr
EndStructure

UseZipPacker()
UsePNGImageDecoder()
UsePNGImageEncoder()

Define hDcDesktop.i = GetDC_(GetDesktopWindow_())
Define pic_counter.i = 1

Define dest_dx.i = 640
Define dest_dy.i = 400
Define image.i = CreateImage(#PB_Any, 640, 400)
Define min_x.i = 0
Define min_y.i = 0
Define w.i = 1920
Define h.i = 1200
Define hDC.i

Global PicBuffer.PictureBuffer

If CreatePack(0, "c:\temp\files.zip") 
  While pic_counter < 3000 ; <--- Den Wert variieren
    hDC = StartDrawing(ImageOutput(image))
    StretchBlt_(hDC, 0, 0, dest_dx, dest_dy, hDcDesktop, min_x, min_y, w, h, #SRCCOPY)
    StopDrawing()
    PicBuffer\ptr = EncodeImage(image,#PB_ImagePlugin_PNG)
    If PicBuffer\ptr = 0
      MessageRequester("Abbruch","PictureBuffer()\ptr = 0. Abbruch bei " + Str(pic_counter) + "Bildern")
      End
    EndIf
    AddPackMemory(0, PicBuffer\ptr, MemorySize(PicBuffer\ptr), "pic"+ "__"+Str(pic_counter)+".png")
    FreeMemory(PicBuffer\ptr)
    pic_counter+1
    Debug pic_counter
  Wend
  ClosePack(0)
EndIf

ReleaseDC_(GetDesktopWindow_(),hDcDesktop)

FreeImage(image)
Grüße ... Peter
Hygge
Benutzeravatar
Stevie63
Beiträge: 86
Registriert: 06.05.2009 23:02
Computerausstattung: Win 10, i7, fsc celsius

Re: EncodeImage

Beitrag von Stevie63 »

Code: Alles auswählen

EnableExplicit

Structure PictureBuffer
  *ptr
EndStructure

UseZipPacker()
UsePNGImageDecoder()
UsePNGImageEncoder()

Define hDcDesktop.i = GetDC_(GetDesktopWindow_())
Define pic_counter.i = 1

Define dest_dx.i = 640
Define dest_dy.i = 400
Define image.i = CreateImage(#PB_Any, 640, 400)
Define min_x.i = 0
Define min_y.i = 0
Define w.i = 1920
Define h.i = 1200
Define hDC.i

Global PicBuffer.PictureBuffer

If CreatePack(0, "c:\temp\files.zip") 
  While pic_counter < 3000 ; <--- Den Wert variieren
    hDC = StartDrawing(ImageOutput(image))
    StretchBlt_(hDC, 0, 0, dest_dx, dest_dy, hDcDesktop, min_x, min_y, w, h, #SRCCOPY)
    StopDrawing()
    PicBuffer\ptr = EncodeImage(image,#PB_ImagePlugin_PNG)
    If PicBuffer\ptr = 0
      MessageRequester("Abbruch","PictureBuffer()\ptr = 0. Abbruch bei " + Str(pic_counter) + "Bildern")
      End
    EndIf
    AddPackMemory(0, PicBuffer\ptr, MemorySize(PicBuffer\ptr), "pic"+ "__"+Str(pic_counter)+".png")
    FreeMemory(PicBuffer\ptr)
    pic_counter+1
    Debug pic_counter
  Wend
  ClosePack(0)
EndIf

ReleaseDC_(GetDesktopWindow_(),hDcDesktop)

FreeImage(image)
Hallo Peter,

vielen Dank für den Code! Ich habe den Code ausprobiert und es läuft so weit alles stabil. Ich hatte die Pointer deshalb in einer Liste, weil die Schleife, wo die Bilder aufgenommen werden, so schnell wie möglich laufen soll. Das mit EncodeImage werde ich noch mal weiter austesten.
Trotzdem vielen Dank für die Hilfe!

Grüße

Stevie
Benutzeravatar
Stevie63
Beiträge: 86
Registriert: 06.05.2009 23:02
Computerausstattung: Win 10, i7, fsc celsius

Re: EncodeImage

Beitrag von Stevie63 »

Folgende Lösung habe ich noch gefunden (aber es beantwortet nicht wirklich die Frage bzgl. dem seltsamen Verhalten von EncodeImage):

Code: Alles auswählen

 
*picptr = EncodeImage(image,image_plugin)
If *picptr = 0
  MessageRequester("Abbruch","PictureBuffer()\ptr = 0. Abbruch bei " + Str(pic_counter) + "Bildern")
  End
EndIf
memsize = MemorySize(*picptr) 
PicBuffer()\ptr = AllocateMemory(memsize)
CopyMemory(*picptr,PicBuffer()\ptr,memsize)
FreeMemory(*picptr)
Stevie
Antworten