48

一部のデータを視覚化する手段として、計算されたピクセル値に基づいて画像を描画したいと考えています。基本的に、カラー トリプレットの 2 次元マトリックスを取得してレンダリングしたいと考えています。

既存の画像を変換したり、画像全体の変換を行ったりしていないため、これは画像処理ではないことに注意してください。また、レンダリングしている画像に事前に決定された構造がないため、ベクター グラフィックスでもありません。おそらく一度に 1 ピクセルずつ色の不定形のブロブを生成することになるでしょう。

今のところ、約 1kx1k ピクセルの画像をレンダリングする必要がありますが、スケーラブルなものが役立ちます。最終的なターゲット形式は、PNG またはその他のロスレス形式です。

私は現在 ImageDraw の draw.point を介して PIL を使用していますが、私が必要とする非常に具体的で比較的基本的な機能を考えると、利用可能なより高速なライブラリはありますか?

4

6 に答える 6

38

持っていnumpyscipy利用できる場合 (Python で大きな配列を操作している場合は、それらをお勧めします)、このscipy.misc.pilutil.toimage関数は非常に便利です。簡単な例:

import numpy as np
import scipy.misc as smp

# Create a 1024x1024x3 array of 8 bit unsigned integers
data = np.zeros( (1024,1024,3), dtype=np.uint8 )

data[512,512] = [254,0,0]       # Makes the middle pixel red
data[512,513] = [0,0,255]       # Makes the next pixel blue

img = smp.toimage( data )       # Create a PIL image
img.show()                      # View in default viewer

良い点はtoimage、さまざまなデータ型に非常にうまく対応しているため、浮動小数点数の 2D 配列が適切にグレースケールなどに変換されることです。

numpyscipyここからダウンロードできます。またはピップを使用して:

pip install numpy scipy
于 2009-01-12T16:20:57.640 に答える
21
import Image
im= Image.new('RGB', (1024, 1024))
im.putdata([(255,0,0), (0,255,0), (0,0,255)])
im.save('test.png')

画像の左上に赤、緑、青のピクセルを配置します。

im.fromstring()バイト値を処理したい場合は、さらに高速です。

于 2009-01-12T11:57:48.857 に答える
2

別のアプローチは、 Python3 での TIC-80 API のオープン ソース実装であるPyxelを使用することです (TIC-80 はオープン ソースの PICO-8 です)。

黒の背景に黄色のピクセルを 1 つだけ描画する完全なアプリを次に示します。

import pyxel

def update():

    """This function just maps the Q key to `pyxel.quit`,
    which works just like `sys.exit`."""

    if pyxel.btnp(pyxel.KEY_Q): pyxel.quit()

def draw():

    """This function clears the screen and draws a single
    pixel, whenever the buffer needs updating. Note that
    colors are specified as palette indexes (0-15)."""

    pyxel.cls(0)            # clear screen (color)
    pyxel.pix(10, 10, 10)   # blit a pixel (x, y, color)

pyxel.init(160, 120)        # initilize gui (width, height)
pyxel.run(update, draw)     # run the game  (*callbacks)

: このライブラリでは 16 色までしか使用できませんが、どの色を変更するかを変更することができます。おそらく、それほど多くの作業を行わなくても、より多くの色をサポートできるようにすることができます。

于 2018-07-30T23:58:13.947 に答える
1

PIL を使用してディスク上にイメージ ファイルを生成し、後でそれをイメージ リーダー ソフトウェアでロードすると思います。

メモリ内の画像を直接レンダリングすることで、速度がわずかに向上するはずです (ディスクに画像を書き込んで再ロードするコストを節約できます)。さまざまな python モジュールでその画像をレンダリングする方法については、このスレッドhttps://stackoverflow.com/questions/326300/python-best-library-for-drawingをご覧ください。

個人的には wxpython とdc.DrawBitmap関数を試してみます。外部イメージ リーダーではなくこのようなモジュールを使用すると、多くの利点があります。

  • 速度
  • パラメータのボタンを備えたインタラクティブなユーザー インターフェイスを作成できます。
  • ズームインおよびズームアウト機能を簡単にプログラムできます
  • 計算するときに画像をプロットできます。これは、計算に多くの時間がかかる場合に非常に役立ちます
于 2009-01-12T08:35:27.130 に答える