Jump to content

Sky Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate
Photo

Image in GUI ändern - Alternative zu GuiControl?


  • Please log in to reply
18 replies to this topic
Seidenweber
  • Moderators
  • 638 posts
  • Last active: Sep 06 2015 01:51 PM
  • Joined: 10 May 2011

Moin Gemeinde!

 

Wenn ich mit

GuiControl,, MyPic, % Pictures[PictureIndex]

das Foto in einem GUI ändere, bekomme ich das nicht ohne Flackern hin unsure.png

 

Ich habe mir ein kleines Tool gebastelt, mit dem ich mittels Mausrad durch die Bilder in einem Verzeichnis "scrollen" und dann mit Funktionstasten verschiedene Aktionen mit dem aktuellen Foto ausführe. Also eine "DiaShow mit Mausrad".

 

Leider geht das kurze Aufblitzen beim Bildwechsel gewaltig auf die Augen, weil das sehr viele Fotos sind.

 

Kennt jemand eine Alternative?

 

Jetzt schon Danke für eventuell kommende Hinweise auf alle möglichen Bildbetrachter  happy.pngIch suche aber nach einer Lösung mit AHK.


All questions & answers are related to AHK 1.1.19.03 x64 Unicode

 


gregster
  • Members
  • 283 posts
  • Last active: Nov 09 2015 03:08 AM
  • Joined: 19 Mar 2009

Ist ein altbekanntes Problem. Ich habe die besten Erfahrungen mit der Kombination zweier kleiner Maßnahmen erreicht, die bspw. Sjc1000 hier einzeln beschreibt ( http://www.autohotke...rol/?hl=flicker ), d. h. möglichst eine GUI mit schwarzem Hintergrund verwenden, also Gui, Color, Black und zusätzlich das Update der GUI während des Bildwechsels deaktivieren und sie erst danach neu zeichnen lassen.

        Gui, Color, Black
...
      
        GuiControl, -Redraw, MyPic
	GuiControl,, MyPic, % Pictures[PictureIndex]
	GuiControl, +Redraw, MyPic

Meistens bringt das etwas, aber perfekt ist es nicht...



Seidenweber
  • Moderators
  • 638 posts
  • Last active: Sep 06 2015 01:51 PM
  • Joined: 10 May 2011

Danke für die Idee. Das ist so schon deutlich besser happy.png

 

Zusätzlich hat es nochmal was gebracht, das mit 2 Controls zu machen, die zuerst geändert und dann angezeigt werden. Aber auch hier gibt es beim Bildwechsel immer noch ab und zu ein kurzes Ausblenden.

 

Vielleicht hat ja noch jemand einen Ansatz. den ich mal testen könnte.


All questions & answers are related to AHK 1.1.19.03 x64 Unicode

 


Pulover
  • Members
  • 1596 posts
  • Last active: Apr 06 2016 04:00 AM
  • Joined: 20 Apr 2012
Kennst du die IL Bibliothek von just me?
 
#NoEnv

Pictures := []
Loop, Screenshots\*.png
	Pictures.Insert(A_LoopFileFullPath)
PicNum := Pictures.MaxIndex()
HIL := IL_Create(PicNum)
IL_SetSize(HIL, 800, 600)
; IL_SetBkColor(HIL)
Loop, % PicNum
	Tooltip % "Loading (" IL_Add(HIL, Pictures[A_Index], 0xFFFFFF, 1) " of " PicNum ")"
Tooltip
Gui, Add, Pic, w800 h600 hwndhPic vMyPic, % Pictures[1]
Gui, Show
return

WheelDown::
PictureIndex++
; GuiControl,, MyPic, % Pictures[PictureIndex]
IL_Draw(HIL, PictureIndex, hPic)
return

WheelUp::
PictureIndex--
; GuiControl,, MyPic, % Pictures[PictureIndex]
IL_Draw(HIL, PictureIndex, hPic)
return

GuiClose:
ExitApp
IL_Destroy(HIL)
return

Rodolfo U. Batista
Pulover's Macro Creator - Automation Tool (Recorder & Script Writer) | Class_LV_Rows - Copy, Cut, Paste and Drag ListViews | Class_Toolbar - Create and modify | Class_Rebar - Adjustable GUI controls

Join the New AutoHotkey Forum!


Seidenweber
  • Moderators
  • 638 posts
  • Last active: Sep 06 2015 01:51 PM
  • Joined: 10 May 2011

Kennst du die IL Bibliothek von just me?

 

Nein. Hatte ich mir nicht angesehen. Mache ich aber jetzt wink.png Danke dir.

 

//Edit

So hab's mir angesehen. Ein schöner Ansatz und sich auch sehr gut zu gebrauchen, wenn einen die Ladezeit nicht stört und die Bilder auch alle dieselben Abmessungen haben.

 

Leider komme ich damit nicht weiter, weil die benötigten Funktionen nicht unterstützt werden - bzw. weil das Teil dann zu langsam wird.

Das "Problem" ist, dass die Bilder alle möglichen Formate und Abmessungen haben können und jeweils skaliert und zentriert angezeigt werden sollen.

 

Die Suche nach Ideen und Alternativen geht also weiter :)


Edited by Seidenweber, 16 July 2013 - 11:04 PM.

All questions & answers are related to AHK 1.1.19.03 x64 Unicode

 


nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012

Wie wäre es mit einfachem GDI+ ?

ptoken:=Gdip_Startup()
Gui,Add,Picture,w800 h600 x0 y0 hwndpic , Beispielbild.jpg ;Das Beispielbild sollte die Abmasse 800x600 haben
PICDC:=GetDC(Pic+0)
G:=Gdip_GraphicsFromHDC(PICDC)
Gui,-caption
Gui,show ,  w800 h600

Loop,3
{
pBitmap:=Gdip_CreateBitmapFromFile(sFile[A_Index]) ;sfile ist ein Array mit Bilder Dateinamen
Gdip_DrawImage(G, pBitmap, 0, 0, 800, 600, 0, 0, Gdip_GetImageWidth(pBitmap), Gdip_GetImageHeight(pBitmap))
Gdip_DisposeImage(pBitmap)
Sleep,2000
}
Gdip_DeleteGraphics(G)
Gdip_Shutdown(pToken)

Visit the new forum ahkscript.org.

http://ahkscript.org


just me
  • Members
  • 1496 posts
  • Last active: Nov 03 2015 04:32 PM
  • Joined: 28 May 2011

Moin,

 

ich habe vor einiger Zeit mal etwas für den Hausgebrauch geschrieben:

 

Spoiler

 

 

Gdip_ImgProps.ahk:

Spoiler

Prefer ahkscript.org for the time being.


Seidenweber
  • Moderators
  • 638 posts
  • Last active: Sep 06 2015 01:51 PM
  • Joined: 10 May 2011

Danke nnnik und just me.

Auch wenn sich die Begriffe "einfach" und "GDI+" widersprechen, sieht das gut aus.

Jetzt habe ich wenigstens eine Vorstellung davon, wie der Rest meiner Woche aussieht.^^

 


All questions & answers are related to AHK 1.1.19.03 x64 Unicode

 


nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012
Ach was ist doch gar nicht so kompliziert

SetImageSmooth(Pic,hwnd)
{
static ptoken=Gdip_Startup()
PICDC:=GetDC(hwnd) ;DeviceContext ermitteln
G:=Gdip_GraphicsFromHDC(PICDC) ;Um dann eine GDIGraphic erstellen
pBitmap:=Gdip_CreateBitmapFromFile(pic) ;lädt eine Bild datei
Gdip_DrawImage(G, pBitmap, 0, 0, 800, 600, 0, 0, Gdip_GetImageWidth(pBitmap), Gdip_GetImageHeight(pBitmap)) ;kopiert die Bitmap in die GDIGraphic des Controls
Gdip_DisposeImage(pBitmap) ;aufräumen
Gdip_DeleteGraphics(G)
}

Visit the new forum ahkscript.org.

http://ahkscript.org


just me
  • Members
  • 1496 posts
  • Last active: Nov 03 2015 04:32 PM
  • Joined: 28 May 2011

Das "Problem" ist, dass die Bilder alle möglichen Formate und Abmessungen haben können und jeweils skaliert und zentriert angezeigt werden sollen.

Ist wohl doch nicht ganz so unkompliziert!

Prefer ahkscript.org for the time being.


nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012
Das meiste macht die Funktion schon.
Für Skalieren: falls du das Seiten Verhältnis beibehalten willst:
CalcScale(dw,dh,sw,sh)
{
If (sh/dh>sw/dw)
{    
newh:=dh,neww:=floor(sw/sh*newh)
newy:=0,newx:=ceil((dw-neww)/2)
}
Else
{    
neww:=dw,newh:=floor(sh/sw*neww)
newx:=0,newy:=ceil((dh-newh)/2)
}
return a:={x:newx,y:newy,w:neww,h:newh}
}

SetImageSmoothScale(Pic,hwnd)
{
static ptoken=Gdip_Startup()
PICDC:=GetDC(hwnd) ;DeviceContext ermitteln
G:=Gdip_GraphicsFromHDC(PICDC) ;Um dann eine GDIGraphic erstellen
pBitmap:=Gdip_CreateBitmapFromFile(pic) ;lädt eine Bilddatei
pBitmap2 := Gdip_CreateBitmap(800, 600)
G2 := Gdip_GraphicsFromImage(pBitmap2)
Gdip_GraphicsClear(G2,0xff000000);muss da sonst Überreste des Vorherigen Bildes bestehen bleiben
scale:=CalcScale(800,600,Gdip_GetImageWidth(pBitmap),Gdip_GetImageHeight(pBitmap))
Gdip_DrawImage(G2, pBitmap, scale.x, scale.y, 800, 600, 0, 0, scale.w, scale.h) 
Gdip_DrawImage(G, pBitmap2, 0, 0, 800, 600, 0, 0, 800, 600)
Gdip_DisposeImage(pBitmap) ;aufräumen
Gdip_DeleteGraphics(G)
Gdip_DisposeImage(pBitmap2) ;aufräumen
Gdip_DeleteGraphics(G2)
}
Skaliert und Zentriert.
Ich habs allerdings nicht getestet.

Visit the new forum ahkscript.org.

http://ahkscript.org


Seidenweber
  • Moderators
  • 638 posts
  • Last active: Sep 06 2015 01:51 PM
  • Joined: 10 May 2011

Danke für die Mühe.

 

Leider führt das alles nicht zum gewünschten Ergebnis, weil durch die Ladezeit des jeweilige Bildes immer ein kurzer Aussetzer, der dann als "Schwarzblende" erkennbar bleibt, entsteht.

Wenn ich das verhindern will, habe ich entweder am Anfang eine kurze Wartezeit oder eben eine kurze Verzögerung bis zur Anzeige des nächsten Bildes.

 

Egal, wie man's macht - so richtig "rund" ist das nie...


All questions & answers are related to AHK 1.1.19.03 x64 Unicode

 


nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012

??

Ich hab dann aber echt keine Ahnung wieso...


Visit the new forum ahkscript.org.

http://ahkscript.org


just me
  • Members
  • 1496 posts
  • Last active: Nov 03 2015 04:32 PM
  • Joined: 28 May 2011

So, das ist das Beste, das ich finden konnte (soll heißen das Minimum an Störungen). Die eine Funktion nutzt weniger GDI, die andere mehr. Die mit weniger GDI scheint im Schnitt schneller zu sein, besonders wenn es um das Herunterskalieren großer Bilder geht. Ich habe das nur mit maximal 4 MP getestet. Mein Office-Rechner scheint schon bei 2 MP etwas zu schwächeln. Der mit Abstand größte Zeitanteil wird allerdings nicht innerhalb von AHK-Funktionen, sondern innerhalb der ladenden und zeichnenden GDI/GDIP-API-Aufrufe in den System-DLLs verbraucht.

 

Spoiler


Prefer ahkscript.org for the time being.


Seidenweber
  • Moderators
  • 638 posts
  • Last active: Sep 06 2015 01:51 PM
  • Joined: 10 May 2011

Oh Mann, da habe ich ja noch mehr Futter ;) Danke

 

Der mit Abstand größte Zeitanteil wird allerdings nicht innerhalb von AHK-Funktionen, sondern innerhalb der ladenden und zeichnenden GDI/GDIP-API-Aufrufe in den System-DLLs verbraucht

Jepp ... und meine Dateien sind teilweise riesig.

 

Ich werde mich da in einer stillen Stunde nochmal in Ruhe dran setzen und deinen Code zerpflücken.

Bis dahin erst mal Danke an euch beide.


All questions & answers are related to AHK 1.1.19.03 x64 Unicode