2011-12-19 11 views
5

Estoy buscando la forma más eficiente de "cuadrar" una imagen para utilizarla como icono. Por ejemplo, tengo un archivo .png cuyas dimensiones son 24x20. No quiero cambiar la parte de "imagen" de la imagen de ninguna manera, solo quiero agregar píxeles transparentes al borde de la imagen para que se convierte en 24x24. Mi investigación sugiere que necesito crear un lienzo transparente 24x24, pegar mi imagen en esto y luego guardar el resultado. Estoy trabajando en wxpython y me preguntaba si alguien podría guiarme en el proceso. Mejor aún, también tengo instalado PIL, y me preguntaba si no había una forma integrada de hacerlo. Parece que el tipo de operación se llevaría a cabo con bastante regularidad, pero ninguno de los métodos de imagen funciona bien.Relleno de una imagen para usar en wxpython

Respuesta

3

Uso image.paste para pegar la imagen en un fondo transparente:

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

Lo he aceptado como la respuesta sobre el enfoque numpy porque usa PIL, que ya he instalado. Gracias por la ayuda. –

3

que podría hacerlo con arreglo numpy bastante fácil .. algo como esto

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

Buena idea. Puedes usar 'scipy.pad', especialmente si no son solo 2 filas. – Mark

1

He aquí una aplicación 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) 
Cuestiones relacionadas