Seite 6 von 9

Verfasst: 20.02.2009 00:28
von ts-soft
> Warum schlägt dieser Code dann fehl?
Weil die Strukture als Pointer erwartet wird

Code: Alles auswählen

XIncludeFile "MiniZIP.pbi"
mzfi.unz_file_info
Index = ZIP_GetFileNumber("music.zip","sample1.ogg")
ZIP_GetFileInfo("music.zip",Index,@mzfi)
Result = ZIP_CatchFile("music.zip",Index)

CreateFile(0,"test.ogg")
WriteData(0,Result,mzfi\uncompressed_size)
CloseFile(0)

Verfasst: 20.02.2009 00:35
von Fluid Byte
ts-soft hat geschrieben:Weil die Strukture als Pointer erwartet wird
Du verwendest im Beispiel "sample1.ogg", versuch mal "sample2.ogg".

Verfasst: 20.02.2009 00:45
von ts-soft
Fluid Byte hat geschrieben:
ts-soft hat geschrieben:Weil die Strukture als Pointer erwartet wird
Du verwendest im Beispiel "sample1.ogg", versuch mal "sample2.ogg".
Es funktioniert mit beiden, test.ogg entsteht immer mit der richtigen größe
Kiffi hat geschrieben:
Fluid Byte hat geschrieben:Mal am Rande, die PureZIP DLL von gnozal hat damit keine Probleme. :twisted:
was Ihr (Du) mal testen könnte(s)t: Tritt dieser 'Bug' auch mit
UsePNGImageDecoder() auf? Hiermit hat nämlich die PureZIP-Lib Probleme.
Vielleicht gibt es Parallelen?

Grüße ... Kiffi
Habs mal getestet:
zip erstellen:

Code: Alles auswählen

XIncludeFile #PB_Compiler_Home + "include\minizip_include.pbi"

Define.s zip = GetTemporaryDirectory() + "flare.zip"
Define.i FF = ZIP_FileCreate(zip)

If FF
  ZIP_FileAdd(FF, #PB_Compiler_Home + "Examples\Sources\Data\flare.png", "-")
  ZIP_FileClose(FF)
EndIf
und testen mit dem geändertem Beispiel der Hilfe:

Code: Alles auswählen

XIncludeFile #PB_Compiler_Home + "include\minizip_include.pbi"

UseJPEGImageDecoder()
UseTGAImageDecoder()
UsePNGImageDecoder()
UseTIFFImageDecoder()

; Enable all the encoders than PureBasic actually supports
;
UseJPEGImageEncoder()
UsePNGImageEncoder()

Define.s zip = GetTemporaryDirectory() + "flare.zip"

If OpenWindow(0, 0, 0, 250, 130, "PureBasic - Image Converter", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

  ImageGadget(0, 0, 28, WindowWidth(0), WindowHeight(0), 0, #PB_Image_Border)

  CreateToolBar(0, WindowID(0))
  ToolBarStandardButton(0, #PB_ToolBarIcon_Open)
  ToolBarStandardButton(1, #PB_ToolBarIcon_Save)
  DisableToolBarButton(0, 1, 1)    ; disable the save button

  Repeat
    EventID = WaitWindowEvent()

    If EventID = #PB_Event_Menu  ; ToolBar are acting as menu

      Select EventMenu()

        Case 0  ; Open

           If CatchImage(0, ZIP_CatchFile(zip, 1))
            SetGadgetState(0, ImageID(0))  ; change the picture in the gadget
            DisableToolBarButton(0, 1, 0)    ; enable the save button
            ResizeWindow(0, #PB_Ignore, #PB_Ignore, ImageWidth(0)+4, ImageHeight(0)+34)
          EndIf

          ;           EndIf

        Case 1  ; Save

          Filename$ = SaveFileRequester("Save a picture", Left(Filename$, Len(Filename$)-Len(GetExtensionPart(Filename$))-1), "BMP Format|*.bmp|JPEG Format|*.jpg|PNG Format|*.png", 0)
          If Filename$

            Select SelectedFilePattern()

              Case 0  ; BMP
                ImageFormat = #PB_ImagePlugin_BMP
                Extension$  = "bmp"

              Case 1  ; JPEG
                ImageFormat = #PB_ImagePlugin_JPEG
                Extension$  = "jpg"

              Case 2  ; PNG
                ImageFormat = #PB_ImagePlugin_PNG
                Extension$  = "png"

            EndSelect

            If LCase(GetExtensionPart(Filename$)) <> Extension$
              Filename$ + "." + Extension$
            EndIf

            If SaveImage(0, Filename$, ImageFormat)
              MessageRequester("Information", "Image saved successfully", 0)
            EndIf

          EndIf

      EndSelect

    EndIf

  Until EventID = #PB_Event_CloseWindow  ; If the user has pressed on the close button

EndIf

End   ; All is automatically freed by PureBasic
Mit IncludeBinary hab ich vorsichtshalber auch getestet, keine Problem bis
jetzt.

Verfasst: 20.02.2009 11:45
von Fluid Byte
ts-soft hat geschrieben:Es funktioniert mit beiden, test.ogg entsteht immer mit der richtigen größe
Führe die Datei mal aus! :wink:

Verfasst: 20.02.2009 12:54
von Fluid Byte
ts-soft hat geschrieben:Weil die Strukture als Pointer erwartet wird
Was genau hat es eigentlich damit auf sich? Habe ich ja vorher auch nicht als Pointer übergeben und funktioniert trotzdem. Es scheitert nur bei Dateien die eine ganz bestimmte Dateigröße überschreiten und das ohne UseOGGSoundDecoder(). Also muss es doch zwangsläufig etwas mit MiniZIP zu tun haben.

Ich hab' mir die beiden Dateien noch mal mit 'Beyond Compare' im hexadezimalen Vergleich angesehen. Die Datei die auf Platte gespeichert wird hat zwar einen korrekten Header aber der Rest ist Schweizer Käse bzw. die beiden Dateien werden wohl miteinander "gemischt":


Bild

GoldWave kann die beschädigte OGG-Datei lesen, allerdings fehlt die Hälfte.

Verfasst: 20.02.2009 16:15
von ts-soft
Beim Streaming geht was schief :oops:
Werde es wohl in kürze behoben haben, bzw. notfalls auf das Streaming
verzichten.

// edit
Bei ExtractFile oder ExtractArchive funktionierts fehlerfrei, keine
Unterschiede in diesem Beyond Compare 3, nettes Tools, damit werde ich
den Fehler wohl rausbekommen

Verfasst: 20.02.2009 16:59
von ts-soft
Update

Fehler in ZIP_CatchFile() gefixed

:allright: danke Fluid Byte für den Fehlerreport!

Gruß
Thomas

// edit
PS: Deine Demo.pb funzt jetzt auch!

Verfasst: 20.02.2009 17:59
von Fluid Byte
ts-soft hat geschrieben:Meine Funktion ist also Fehlerfrei, ...
ts-soft hat geschrieben:Beim Streaming geht was schief :oops:
:twisted:
ts-soft hat geschrieben:Unterschiede in diesem Beyond Compare 3, nettes Tools, damit werde ich den Fehler wohl rausbekommen
Beyond Compare ist eines der besten Tools die ich in den letzten Jahren gefunden habe. Somit kann ich auf einfache Weise alle nötigen Dateien für ein Backup auf ein entsprechendes Medium spiegeln. Und vor allem nur Dateien die neu hinzugekommen sind bzw. geändert wurden. Außerdem fällt die lästige Komprimierung weg die ich bei jedem anderen Tool gesehen habe. Das ist zwar nett gemeint aber überflüssig wenn man schnell Änderungen übernehmen will (und Platzmangel ist eh kein Thema mehr). Toptool!
ts-soft hat geschrieben:Fehler in ZIP_CatchFile() gefixed
Perfekt. Nun kann ich mein Werk vollenden! :mrgreen:
ts-soft hat geschrieben::allright: danke Fluid Byte für den Fehlerreport!
Keine Ursache. Das war es ja wohl absolut wert. :D

Verfasst: 20.02.2009 18:08
von ts-soft
Fluid Byte hat geschrieben:Perfekt. Nun kann ich mein Werk vollenden! :mrgreen:
Und ich bald beginnen (mein neues Werk, was MiniZip benötigt) :mrgreen:

// Nachtrag:
@Fluid Byte
Hier eine beschleunigte Version von ZIP_AccessArchive aus dem Democode:

Code: Alles auswählen

Procedure ZIP_AccessArchive(Filename.s, *Length.LONG)
	Protected *Mem, ZIPFile$ = "music.zip"

	*Mem = ZIP_CatchFile(ZIPFile$, ZIP_GetFileNumber(ZIPFile$, Filename))
  If *Mem
    *Length\l = MemorySize(*Mem)
    ProcedureReturn *Mem
  EndIf
EndProcedure
MemorySize() sollte schneller als ZIP_GetFileInfo() sein

Verfasst: 22.02.2009 08:21
von ts-soft
Update

hinzugefügt:
ZIP_IsZipArchive(), damit kann man Archive (auch Exen u. ä) vorm entpacken überprüfen.

repariert und verbessert:
Unicode-Support

Alle Dateioperationen beschleunigt!
Danke auch an edel, der mir ein paar C-Header angepaßt hat, um dies zu ermöglichen :allright: