2012-06-25 29 views
5

Tôi đang cố gắng vẽ một hình vuông RGBA 256x256 pixel đơn giản sử dụng mô-đun png của python.PyPNG để vẽ một ô được điền đơn giản

Tôi muốn sử dụng hàm png.Writer và tôi hình dung rằng tôi phải vẽ nó bằng phương thức write(). Tôi chưa có may mắn! Tôi không có niềm tin vào mã hiện tại của mình nên tôi sẵn sàng nhận đề xuất từ ​​đầu

Tôi không muốn sử dụng PIL nếu có thể.

Mọi đề xuất?

Trả lời

8

Tôi nghĩ rằng định dạng là những gì có thể ảnh hưởng đến bạn, có vẻ như png có ba định dạng ...

>>> help(png) 
    Boxed row flat pixel:: 

    list([R,G,B, R,G,B, R,G,B], 
     [R,G,B, R,G,B, R,G,B]) 

    Flat row flat pixel::  

     [R,G,B, R,G,B, R,G,B, 
     R,G,B, R,G,B, R,G,B] 

    Boxed row boxed pixel:: 

     list([ (R,G,B), (R,G,B), (R,G,B) ], 
      [ (R,G,B), (R,G,B), (R,G,B) ]) 

Các alpha được nối vào cuối của mỗi dãy RGB.

write(self, outfile, rows) 
|  Write a PNG image to the output file. `rows` should be 
|  an iterable that yields each row in boxed row flat pixel format. 
|  The rows should be the rows of the original image, so there 
|  should be ``self.height`` rows of ``self.width * self.planes`` values. 
|  If `interlace` is specified (when creating the instance), then 
|  an interlaced PNG file will be written. Supply the rows in the 
|  normal image order; the interlacing is carried out internally. 

lưu ý các each row in boxed row flat pixel format.

heres một ví dụ nhanh chóng mà vẽ một hình vuông màu trắng.

>>> rows = [[255 for element in xrange(4) for number_of_pixles in xrange(256)] for number_of_rows in xrange(256)] 
>>> import numpy # Using numpy is much faster 
>>> rows = numpy.zeros((256, 256 * 4), dtype = 'int') 
>>> rows[:] = 255 
>>> png_writer = png.Writer(width = 256, height = 256, alpha = 'RGBA') 
>>> png_writer.write(open('white_panel.png', 'wb'), rows) 

lưu ý rằng Writer cũng có thể sử dụng 2 định dạng khác có thể dễ sử dụng hơn.

 | write_array(self, outfile, pixels) 
    |  Write an array in flat row flat pixel format as a PNG file on 
    |  the output file. See also :meth:`write` method. 
    | 
    | write_packed(self, outfile, rows) 
    |  Write PNG file to `outfile`. The pixel data comes from `rows` 
    |  which should be in boxed row packed format. Each row should be 
    |  a sequence of packed bytes. 

Cố gắng sử dụng numpy nhanh hơn và dễ dàng hơn khi xử lý ma trận, hình ảnh có thể được biểu diễn dưới dạng ma trận.

chúc may mắn.

Nếu bạn muốn in màu thì bạn cần tính giá trị RGB cho màu đó, ví dụ màu đỏ là (255, 0, 0, 255).

import png 
import numpy 
rows = numpy.zeros((256, 256, 4), dtype = 'int') # eassier format to deal with each individual pixel 
rows[:, :] = [255, 0, 0, 255] # Setting the color red for each pixel 
rows[10:40, 10:40] = [0, 255, 255, 255] # filled squared starting at (10,10) to (40,40) 
locs = numpy.indices(rows.shape[0:2]) 
rows[(locs[0] - 80)**2 + (locs[1] - 80)**2 <= 20**2] = [255, 255, 0, 255] # yellow filled circle, with center at (80, 80) and radius 20 
png_writer = png.Writer(width = 256, height = 256, alpha = 'RGBA') # create writer 
png_writer.write(open('colors_panel.png', 'wb'), rows.reshape(rows.shape[0], rows.shape[1]*rows.shape[2])) # we have to reshape or flatten the most inner arrays so write can properly understand the format 
+0

Điều này cực kỳ hữu ích và tôi hiểu rõ hơn về sự khác biệt về định dạng. Tuy nhiên, tôi không thể có được hình ảnh để in màu. Tôi có cần một bảng màu cho phương thức .Writer không? Tôi đã tham khảo sách hướng dẫn, nhưng hơi mơ hồ một chút. – Layla

+0

@Layla Tôi đã cập nhật ... –

+0

@Layla bạn không phải làm bất cứ điều gì để viết ra màu sắc nhưng chắc chắn rằng bạn đang thiết lập đúng các giá trị RGB cho màu đó, tôi đã thêm một vài ví dụ bổ sung. –

Các vấn đề liên quan