2011-12-19 5 views
5

Sto cercando il modo più efficiente per "quadrare" un'immagine da utilizzare come icona. Ad esempio, ho un file .png le cui dimensioni sono 24x20. Non voglio modificare la parte dell'immagine dell'immagine in alcun modo, voglio solo aggiungere pixel trasparenti al bordo dell'immagine in modo che diventa 24x24. La mia ricerca suggerisce che ho bisogno di creare una tela trasparente 24x24, incollare la mia immagine su questo, quindi salvare il risultato. Sto lavorando su wxpython e mi chiedevo se qualcuno potesse guidarmi attraverso il processo. Meglio ancora, ho anche installato PIL, e mi chiedevo se non esistesse un modo integrato per farlo. Sembra che il tipo di operazione possa essere eseguita abbastanza regolarmente, ma nessuno dei metodi imageops è abbastanza adatto.Riempimento di un'immagine per l'uso in wxpython

risposta

3

Usa image.paste incollare l'immagine su uno sfondo trasparente:

import Image 
FNAME = '/tmp/test.png' 
top = Image.open(FNAME).convert('RGBA') 
new_w = new_h = max(top.size) 
background = Image.new('RGBA', size = (new_w,new_h), color = (0, 0, 0, 0)) 
background.paste(top, (0, 0)) 
background.save('/tmp/result.png') 
+0

hanno accettato questo come la risposta rispetto all'approccio NumPy perché utilizza PIL, che ho già installato. Grazie per l'aiuto. –

3

si potrebbe fare con l'allineamento NumPy abbastanza facile .. qualcosa di simile

import matplotlib.pyplot as plt 
import numpy as np 
im1 = plt.imread('your_im.png') 
im0 = np.zeros((24, 24, 4), dtype=im1.dtype) 
im0[2:-2,:,:] = im1 
plt.imsave('your_new_im.png', im0) 
+0

Buona idea. Puoi usare 'scipy.pad', specialmente se non sono solo 2 righe. – Mark

1

Ecco un'implementazione pura wxPython.

import wx 

app = wx.PySimpleApp() 

# load input bitmap 
bitmap = wx.Bitmap('input.png') 

# compute dimensions 
width, height = bitmap.GetSize() 
size = max(width, height) 
dx, dy = (size - width)/2, (size - height)/2 

# create output bitmap 
new_bitmap = wx.EmptyBitmap(size, size) 
dc = wx.MemoryDC(new_bitmap) 
dc.SetBackground(wx.Brush(wx.Colour(255, 0, 255))) 
dc.Clear() 
dc.DrawBitmap(bitmap, dx, dy) 
del dc 

# save output 
image = wx.ImageFromBitmap(new_bitmap) 
image.SetMaskColour(255, 0, 255) 
image.SaveFile('output.png', wx.BITMAP_TYPE_PNG)