Wie resize ich Bilder aus einer ImageList?

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Benutzeravatar
STiGMaTa_ch
User
Beiträge: 32
Registriert: Sonntag 14. Mai 2006, 22:58
Wohnort: Rueti ZH, Schweiz

Hallo zusammen.

Für mein DOSBox Frontend möchte ich die Möglichkeit bieten die erfassten Konfigurationen als Icons oder als Liste (report mode) darzustellen.

Im Icon Mode wird ein 48x48 Pixel grosses gif benutzt. Im report Mode sollte das selbe Bild aber nur noch 16x16 Pixel gross sein. Die Frage ist nun, wie kann ich die ImageList der Icons mit den 48x48 Pixel grossen Bildern verwenden, so dass bei der Liste im report mode das Icon nur 16x16 Pixel gross ist?

Im Moment verwende ich wx.Bitmap um die ImageList zu erstellen:

Code: Alles auswählen

        # Icon List
        self.IconDict=dict()
        self.TabIcons = wx.ListCtrl(self.notebookGames, -1, style=wx.LC_ICON|wx.SUNKEN_BORDER|wx.LC_AUTOARRANGE)
        self.IconList = wx.ImageList(48, 48, True)
        if not len(conf.FrodoProfiles.sections()) == 0:
            self.PopulateIconList()
            self.TabIcons.AssignImageList(self.IconList, wx.IMAGE_LIST_NORMAL)
            self.PopulateTabList()
        # Icon List end

[...]

    def PopulateIconList(self):
        self.ProfileSectionNames = conf.FrodoProfiles.sections()
        self.ProfileSectionNames.sort()
        for a in range(len(conf.FrodoProfiles.sections())):
            SectionName = self.ProfileSectionNames[a]
            IconPath = conf.FrodoProfiles.get(SectionName, 'icon')
            bmp = wx.Bitmap(IconPath, wx.BITMAP_TYPE_ANY)
            self.IconMax = self.IconList.Add(bmp)
            self.IconDict[SectionName] = a

    def PopulateTabList(self):
        for a in range(len(conf.FrodoProfiles.sections())):
            img = self.IconDict.has_key(self.ProfileSectionNames[a])
            self.TabIcons.InsertImageStringItem(a,self.ProfileSectionNames[a],self.IconDict[self.ProfileSectionNames[a]])
Hat mir jemand einen Tipp?

Lieber Gruss
STiGMaTa
EDV-Systeme verarbeiten, womit sie gefüttert werden. Kommt Mist rein, kommt Mist raus. (André Kostolany)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

STiGMaTa_ch hat geschrieben:Die Frage ist nun, wie kann ich die ImageList der Icons mit den 48x48 Pixel grossen Bildern verwenden, so dass bei der Liste im report mode das Icon nur 16x16 Pixel gross ist?
Hi STiGMaTa!

Das habe ich jetzt nicht ausprobiert, aber ich denke, man kann mehrere ImageLists zuweisen.

Code: Alles auswählen

import wx

il_normal = wx.ImageList(46, 46)
il_small = wx.ImageList(16, 16)

lv = wx.ListView(None, -1)
lv.AssignImageList(il_normal, wx.IMAGE_LIST_NORMAL)
lv.AssignImageList(il_small, wx.IMAGE_LIST_SMALL)
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
STiGMaTa_ch
User
Beiträge: 32
Registriert: Sonntag 14. Mai 2006, 22:58
Wohnort: Rueti ZH, Schweiz

Hallo Gerold

Danke für die Antwort. Aber müsste ich dann nicht trotzdem zweimal das Bild führen? 1x mit 48x48 und einmal mit 16x16??

Eigentlich würde ich das ja gerne vermeiden und nur das 48er Bild gespeichert haben und dieses dann automatisch mit 16x16 ausgeben lassen.

Lieber Gruss
STiGMaTa
EDV-Systeme verarbeiten, womit sie gefüttert werden. Kommt Mist rein, kommt Mist raus. (André Kostolany)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

STiGMaTa_ch hat geschrieben:Aber müsste ich dann nicht trotzdem zweimal das Bild führen? 1x mit 48x48 und einmal mit 16x16??
Hi STiGMaTa!

Zumindest kannst du es dir sparen, auch die kleinen Bilder im Dateisystem zu speichern.

Code: Alles auswählen

large_img = wx.Image("dateiname.png", wx.BITMAP_TYPE_PNG)
small_img = large_img.Scale(16, 16)

large_bmp = wx.BitmapFromImage(large_img)
small_bmp = wx.BitmapFromImage(small_img)
Das könntest du doch in deine Schleife zum Füllen der ImageLists einsetzen...

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
STiGMaTa_ch
User
Beiträge: 32
Registriert: Sonntag 14. Mai 2006, 22:58
Wohnort: Rueti ZH, Schweiz

Gnaaa.. so einfach kann es sein! :oops:

Danke gerold.

Aber eine Frage habe ich noch. Was ist der Unterschied zwischen wx.Bitmap und wx.Image (abgesehen davon, dass Bitmap z.B. kein Scale kennt).

Verstehe ich das richtig, dass ich solange ich an einem Bild noch was machen möchte (rotieren, skalieren etc.) dieses mit wx.Image anspreche, sobald ich das Bild aber dann z.B. in einer Icon List Control nutzen möchte ich das Image in Bitmap umändern muss?

Lieber Gruss
STiGMaTa
EDV-Systeme verarbeiten, womit sie gefüttert werden. Kommt Mist rein, kommt Mist raus. (André Kostolany)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

STiGMaTa_ch hat geschrieben:Verstehe ich das richtig, dass ich solange ich an einem Bild noch was machen möchte (rotieren, skalieren etc.) dieses mit wx.Image anspreche, sobald ich das Bild aber dann z.B. in einer Icon List Control nutzen möchte ich das Image in Bitmap umändern muss?
Hi STiGMaTa!

Ja, so ist es. Du braucht im wxPython immer dann ein Bitmap, wenn ein Bild angezeigt, gezeichnet oder sonst irgendwie auf einem DeviceContext ausgegeben werden soll.

Im Buch "wxPython in Action" steht es auf Seite 357 so erklärt:
Image manipulation in wxPython is a dual-heades system where platform-independent image handling is managed by the class wx.Image, while platform-dependent image handling is managed by the class wx.Bitmap. In practice, what this means is that external file formats are loaded and saved by wx.Image, while wx.Bitmap takes care of displaying the image to the screen.
lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten