2011-12-19 26 views
5

Tôi đang tìm cách hiệu quả nhất để 'hình vuông' một hình ảnh để sử dụng làm biểu tượng. Ví dụ: tôi có tệp .png có kích thước là 24x20. Tôi không muốn thay đổi phần 'hình ảnh' của hình ảnh theo bất kỳ cách nào, tôi chỉ muốn thêm pixel trong suốt vào cạnh của hình ảnh để nó trở thành 24x24. Nghiên cứu của tôi cho thấy rằng tôi cần tạo một canvas 24x24 trong suốt, dán hình ảnh của tôi vào đó, sau đó lưu kết quả. Tôi đang làm việc trong wxpython và đã tự hỏi nếu có ai có thể hướng dẫn tôi qua quá trình này. Tốt hơn, tôi cũng đã cài đặt PIL, và đã tự hỏi nếu không có một cách tích hợp để làm điều này. Nó có vẻ giống như các loại hình hoạt động sẽ được thực hiện khá thường xuyên, nhưng không có phương pháp hình ảnh nào phù hợp với hóa đơn.Chèn hình ảnh để sử dụng trong wxpython

Trả lời

3

Sử dụng image.paste để dán hình ảnh nền trong suốt:

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

Đã chấp nhận điều này làm câu trả lời về cách tiếp cận gọn gàng vì nó sử dụng PIL mà tôi đã cài đặt. Cảm ơn đã giúp đỡ. –

3

Bạn có thể làm điều đó với mảng NumPy khá dễ dàng .. một cái gì đó như thế này

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

Ý tưởng hay. Bạn có thể sử dụng 'scipy.pad', đặc biệt nếu nó không chỉ là 2 hàng. – Mark

1

Dưới đây là một wxPython thực hiện thuần túy.

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) 
Các vấn đề liên quan