Seite 1 von 1

Wie resize ich Bilder aus einer ImageList?

Verfasst: Freitag 26. Mai 2006, 12:18
von STiGMaTa_ch
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

Re: Wie resize ich Bilder aus einer ImageList?

Verfasst: Freitag 26. Mai 2006, 13:04
von gerold
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
:-)

Verfasst: Freitag 26. Mai 2006, 13:57
von STiGMaTa_ch
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

Verfasst: Freitag 26. Mai 2006, 14:28
von gerold
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
:-)

Verfasst: Samstag 27. Mai 2006, 11:43
von STiGMaTa_ch
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

Verfasst: Samstag 27. Mai 2006, 12:48
von gerold
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
:-)