Pythonのpngモジュールを使用して、単純な256x256ピクセルのRGBA正方形を描画しようとしています。
png.Writer関数を使用したいのですが、write()メソッドを使用して描画する必要があると思います。しかし、私は運がありませんでした!私は現在のコードを信頼していないので、最初から提案を喜んで受け入れます
可能であればPILは使用しない方がいいです。
助言がありますか?
フォーマットはあなたに影響を与えているかもしれないものだと思います、それpng
は3つのフォーマットを持っているようです...
>>> 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) ])
各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.
注意してくださいeach row in boxed row flat pixel format.
ここに白い正方形を描く簡単な例があります。
>>> 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)
Writer
おそらく使いやすい他の2つの形式も使用できることに注意してください。
| 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.
行列演算を処理するときは、はるかに高速で簡単に使用numpy
してみてください。画像は行列として表すことができます。
幸運を。
色を印刷する場合は、その色のRGB値を計算する必要があります。たとえば、赤は(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
これは、真っ赤なpngファイルを作成する簡単な例です。
import png
width = 255
height = 255
img = []
for y in range(height):
row = ()
for x in range(width):
row = row + (255, 0, 0, 255)
img.append(row)
with open('red.png', 'wb') as f:
w = png.Writer(width, height, greyscale=False, alpha='RGBA')
w.write(f, img)