Registrieren Einloggen
Passwort vergessen
Index Letzte Beiträge (0) Gruppen Suchen Wer ist online?
RSS-Feed Formel-Generator Grafiker-Galerie PB-Lexikon
FAQ Support-Unterforum
Die Netiquette
PureBasic-Lounge (PureBasic - Forum) Foren-Übersicht Win-API PureBasic-Library
Benutzer
Forum (0)
Diverses
Hilfe
Nächstes Thema anzeigen
Vorheriges Thema anzeigen

Neues Thema eröffnenNeue Antwort erstellen Vorheriges Thema anzeigenDieses Thema verschickenZeige Benutzer, die dieses Thema gesehen habenDieses Thema als Datei sichernPrintable versionEinloggen, um private Nachrichten zu lesenNächstes Thema anzeigen
Autor Nachricht
bembulak
Ehrenmitglied
<u><b>Ehrenmitglied</b></u>


Alter: 31
Anmeldungsdatum: 18.07.2005
Beiträge: 2932
Wohnort: Vöcklabruck
austria.gif



Ist absolut produktivIst absolut produktivIst absolut produktivIst absolut produktiv (163)

BeitragVerfasst am: Tue Mar 09, 2010 9:12 am  Titel:  Thumbnail/Bildvorschau: wie und vorallem performant Antworten mit ZitatNach untenNach oben

Hallo!

Gerade betreibe ich für ein aktuelles Projekt ein wenig "Research".

Jetzt zu meinem Problem:
Für's Projekt muss ich Thumbnails anzeigen - ich benötige also eine performante Bildvorschau.

Mit einem normalen ListView bekomme ich es nicht hin, da sind mir die Icons mit 32x32 Pixel einfach zu klein. Gäbe es eine Möglichkeit, das Ding so zu manipulieren, dass es sich wie der Windows-Explorer im Ansichtsmodus "Miniaturansicht" (unter Windows XP) verhält, wäre meine Entscheidung schon gefallen. Nur bräuchte ich das dann auch wieder für GTK+2 unter Linux. Wäre mir aber egal.

Gestern habe ich mir von srod (nxSoftware) den ImageArray angesehen. Das Ding sieht nett aus, ist aber überhaupt nicht performant. Ein durchschnittlicher Ordner, den ich bearbeiten soll, hat aber 400MiB und mehr (hochaufgelöste Digitalbilder).
So müsste ich erste eine Möglichkeit finden in wirklich ruckartiger Geschwindigkeit Thumbnails für die Bilder zu machen und dem ImageArrayGadget zu übergeben.
Nachteile: erstens fehlt mir dazu das Wissen, wie ich das anstellen könnte und zweitens läuft dieses ImageArray nur auf Windows. Beit GTK+2 hätte ich das alte Problem wieder.

Ich habe schon an ImageButtons gedacht, weil man die "toggeln" kann und sie somit ihren Zweck schon erfüllen würden. Aber dabei habe ich wieder mein Performanceproblem mit den Thumbnails.

Lange Rede, kurzer Sinn:
fällt euch vielleicht etwas ein, wie man das Lösen könnte?
Thumbnails schnell generieren und in PureBasic so anzeigen, dass ich diese dann markieren und Drag'n'Drop damit ausführen kann.
Mir fällt auch beim besten Willen nix ein. Sad

Danke.

Grüße!

Mein freies Iconset:
http://bembulak.deviantart.com/art/Monfalcon-Icon-Set-1-171255769
Jungfrau Geschlecht:Männlich Ziege OfflinePersönliche Gallerie von bembulakBenutzer-Profile anzeigenPrivate Nachricht senden
Kaeru Gaman
PureGuru
PureGuru


Alter: 41
Anmeldungsdatum: 10.02.2005
Beiträge: 3156
Wohnort: Korbach
japan.gif



War überaus produktivWar überaus produktivWar überaus produktiv (84)

BeitragVerfasst am: Tue Mar 09, 2010 11:54 am  Titel:   Antworten mit ZitatNach untenNach oben

die Miniaturanzeige im Explorer arbeitet aber auch mit einer thumbs.db, die liegt versteckt im Bilderverzeichnis.
schalte mal in deinem 400MiB Verzeichnis auf Details oder Liste,
lösche mal die versteckte Systemdatei thumbs.db und schalte dann wieder auf Miniaturansicht.
dann siehst du die tatsächliche Performanz.

der Trick liegt darin, die DB nur bei Bedarf zu aktualisieren.
das könntest du selber auch machen und dann wär für dich das ImageArray bestimmt auch schnell genug.

miß doch mal, wie lange ein LoadImage() / ResizeImage(#Raw) / SaveImage() / FreeImage() tatsächlich dauert.
wie gesagt, diesen Zugriff musst du nur einmal durchführen wenn ein Bild neu gespeichert oder verschoben wird.
die eigentliche Problematik ist also die DB Tabelle mit den Thumbnails als BLOBs.
in welcher Form du die nacher auf den Bildschirm bringst, ist weniger umfangreich.
sogar ein dynamischer Anzeigebereich mit simplen ImageGadgets per #PB_Any die du in einer LL speicherst
sollte simples Handwerk sein und trotz unterschiedlicher GUI Systeme kaum unterschiedlich zu handhaben...

oh... and have a nice day.
Löwe Geschlecht:Männlich Hahn OfflinePersönliche Gallerie von Kaeru GamanBenutzer-Profile anzeigenPrivate Nachricht sendenSkype
adra
PB-Novice 2


Alter: 17
Anmeldungsdatum: 24.08.2006
Beiträge: 415
Wohnort: Lindau
germany.gif



War schon produktiv (25)

BeitragVerfasst am: Tue Mar 09, 2010 12:00 pm  Titel:   Antworten mit ZitatNach untenNach oben

Hab einen UraltCode gefunden und schnell auf 4.4 geupdatet
ist seeehr Quick'n'Durty, aber tut sein Zweck, kannst ja anpassen ^^


OpenWindow(0,0,0,400,400,"Thumbnail Gadget by Adra",#PB_Window_ScreenCentered)

Path$ = PathRequester("BilderOrdner markieren","")

UsePNGImageDecoder()
UseJPEGImageDecoder()

AllowedFiles$ = "JPG|JPEG|PNG|BMP"

ExamineDirectory(0,Path$,"*.*")

#MaxPics = 100

While NextDirectoryEntry(0)
  If FindString(AllowedFiles$,UCase(GetExtensionPart(DirectoryEntryName(0))),0)
    LoadImage(ImageCounter,Path$+DirectoryEntryName(0))
    ImageCounter + 1
    If ImageCounter>#MaxPics
      CreateImage(99,100,100,32)
      StartDrawing(ImageOutput(100))
        DrawingMode(#PB_2DDrawing_Transparent)
        DrawText(20,20,"OverFlow",RGB(255,0,0))
      StopDrawing()
      Break
    EndIf
  EndIf
Wend

X      = 50
Y      = 50
Width  = 300
Height = 300
Thumbnail = 100

NewList Selected()

LoadFont(0,"Verdana",12)

ScrollBarGadget(0,X+Width,Y,20,Height,0,(ImageCounter-1)/(Width/Thumbnail),10,#PB_ScrollBar_Vertical)

Repeat
  ev=WaitWindowEvent()
 
  StartDrawing(WindowOutput(0))
    ToDisplay = Scroll
    DrawingMode(#PB_2DDrawing_Outlined)
    Box(X-1,Y-1,Width+2,Height+2)
    For ToDisplayY = 0 To Height/Thumbnail - 1
      For ToDisplayX = 0 To Width/Thumbnail - 1
        If IsImage(ToDisplay)
          DrawImage(ImageID(ToDisplay),X+ToDisplayX*Thumbnail,Y+ToDisplayY*Thumbnail,Thumbnail,Thumbnail)
          Box(X+ToDisplayX*Thumbnail,Y+ToDisplayY*Thumbnail,Thumbnail,Thumbnail)
          If WindowMouseX(0)>X+ToDisplayX*Thumbnail And WindowMouseX(0)<X+ToDisplayX*Thumbnail+Thumbnail
            If WindowMouseY(0)>Y+ToDisplayY*Thumbnail And WindowMouseY(0)<Y+ToDisplayY*Thumbnail+Thumbnail
              Box(X+ToDisplayX*Thumbnail,Y+ToDisplayY*Thumbnail,Thumbnail,Thumbnail,RGB(255,255,0))
             
              If GetAsyncKeyState_(#VK_LBUTTON)
                While GetAsyncKeyState_(#VK_LBUTTON) : Delay(1) : Wend
                Deleted=0
                ForEach Selected()
                  If Selected()=(Scroll+ToDisplayY)*(Width/Thumbnail)+ToDisplayX
                    DeleteElement(Selected())
                    Deleted=1
                  EndIf
                Next
                If Not Deleted
                  AddElement(Selected()) : Selected()=(Scroll+ToDisplayY)*(Width/Thumbnail)+ToDisplayX
                EndIf
              EndIf
            EndIf
          EndIf
         
          ForEach Selected()
            If Selected()=(Scroll+ToDisplayY)*(Width/Thumbnail)+ToDisplayX
              DrawingMode(0)
              Box(X+ToDisplayX*Thumbnail+Thumbnail-20,Y+ToDisplayY*Thumbnail+5,15,15,RGB(255,255,255))
              Box(X+ToDisplayX*Thumbnail+Thumbnail-18,Y+ToDisplayY*Thumbnail+7,11,11,RGB(55,55,55))
              DrawingMode(#PB_2DDrawing_Transparent|#PB_2DDrawing_Outlined)
              DrawingFont(FontID(0))
              DrawText(X+ToDisplayX*Thumbnail+Thumbnail-18,Y+ToDisplayY*Thumbnail+4,"X",RGB(255,255,255))
              Box(X+ToDisplayX*Thumbnail,Y+ToDisplayY*Thumbnail,Thumbnail,Thumbnail,RGB(255,255,255))
              Box(X+ToDisplayX*Thumbnail+2,Y+ToDisplayY*Thumbnail+2,Thumbnail-4,Thumbnail-4,RGB(0,255,0))
              Box(X+ToDisplayX*Thumbnail+4,Y+ToDisplayY*Thumbnail+4,Thumbnail-8,Thumbnail-8,RGB(255,0,0))
              DrawingMode(#PB_2DDrawing_Outlined)
            EndIf
          Next
         
          ToDisplay+1
        Else
          DrawingMode(0)
          Box(X+ToDisplayX*Thumbnail,Y+ToDisplayY*Thumbnail,Thumbnail,Thumbnail,RGB(152,152,152))
        EndIf
      Next
    Next
  StopDrawing()
 
 
  If ev=#PB_Event_Gadget
    Select EventGadget()
      Case 0
        scroll=GetGadgetState(0)*(Width/Thumbnail)
    EndSelect
  EndIf
 
  Delay(1)
Until ev=#PB_Event_CloseWindow


Hoffe das hilft, auch wenns n sehr schlechter Code is Very Happy
(dafür is er glaub ich auch auf Linux nutzbar Wink )

Image
Krebs Geschlecht:Männlich Hahn OfflinePersönliche Gallerie von adraBenutzer-Profile anzeigenPrivate Nachricht sendenE-Mail sendenMSN Messenger
bembulak
Ehrenmitglied
<u><b>Ehrenmitglied</b></u>


Alter: 31
Anmeldungsdatum: 18.07.2005
Beiträge: 2932
Wohnort: Vöcklabruck
austria.gif



Ist absolut produktivIst absolut produktivIst absolut produktivIst absolut produktiv (163)

BeitragVerfasst am: Tue Mar 09, 2010 12:33 pm  Titel:   Antworten mit ZitatNach untenNach oben

Danke euch beiden.
@Kaeru: die Thumbs.DB habe ich aber unter Linux wieder nicht. Ich "muss" also mehr oder weniger die Thumbnails selber erstellen.

@adra: das sieht schon sehr gut aus, ich werde zwar versuchen müssen, mit der Performanz was zu tun, aber im Grunde ist das schon sehr, sehr gut. Danke vielmals.

Grüße!

Mein freies Iconset:
http://bembulak.deviantart.com/art/Monfalcon-Icon-Set-1-171255769
Jungfrau Geschlecht:Männlich Ziege OfflinePersönliche Gallerie von bembulakBenutzer-Profile anzeigenPrivate Nachricht senden
Kaeru Gaman
PureGuru
PureGuru


Alter: 41
Anmeldungsdatum: 10.02.2005
Beiträge: 3156
Wohnort: Korbach
japan.gif



War überaus produktivWar überaus produktivWar überaus produktiv (84)

BeitragVerfasst am: Tue Mar 09, 2010 12:49 pm  Titel:   Antworten mit ZitatNach untenNach oben

das sollte auch nur ein Beispiel sein.
ich dachte, du hättest vielleicht auch ein Windows zur Verfügung, damit du dir ein Bild von der tatsächlichen Geschwindigkeit machen kannst.

generell würde ich eher so vorgehen wie oben gesagt: vorab die Thumbnails erstellen, als simple Images, z.b. per ResizeImage.
Anzeigen dann per ImageGadget, das ist auf jeder Plattform viel schneller und sauberer als Drawing.

oh... and have a nice day.
Löwe Geschlecht:Männlich Hahn OfflinePersönliche Gallerie von Kaeru GamanBenutzer-Profile anzeigenPrivate Nachricht sendenSkype
adra
PB-Novice 2


Alter: 17
Anmeldungsdatum: 24.08.2006
Beiträge: 415
Wohnort: Lindau
germany.gif



War schon produktiv (25)

BeitragVerfasst am: Tue Mar 09, 2010 5:34 pm  Titel:   Antworten mit ZitatNach untenNach oben

@bembulak,kein problem und dankeschön Very Happy Der ProgStyle in dem Code is aber grauenhaft ^^

Image
Krebs Geschlecht:Männlich Hahn OfflinePersönliche Gallerie von adraBenutzer-Profile anzeigenPrivate Nachricht sendenE-Mail sendenMSN Messenger
Beiträge der letzten Zeit anzeigen:      
Neues Thema eröffnenNeue Antwort erstellen Vorheriges Thema anzeigenDieses Thema verschickenZeige Benutzer, die dieses Thema gesehen habenDieses Thema als Datei sichernPrintable versionEinloggen, um private Nachrichten zu lesenNächstes Thema anzeigen

Nächstes Thema anzeigen
Vorheriges Thema anzeigen
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.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum nicht herunterladen


Alle Zeiten sind GMT
Powered by phpBB2 Plus © 2001, 2002 phpBB Group :: Designed by DerWebWolf.de

Brieffreunde finden im Internet mit Net-Channel.de