0

PNG 画像を読み込み、各ピクセルの RGB 値を含むマトリックスを作成する方法を見つけようとしています。現在、次の方法を使用してファイルをロードし、さまざまな RGB 値を取得しています。

  def to_pixels
    File.open(@file, 'r') do |file|
      byte_block = file.read
      byte_block.each_byte do |byte|
        @pixels << byte
      end
    end
  end

私の理解では、各ピクセルには R、G、および B の値を表す 3 バイトが含まれています。最初に、出力配列 @pixels を取得して、各ピクセルのピクセル順序と RGB 値が出力に保持されていると仮定して、3 つの要素のサブグループにグループ化しようとしました。例えば:

@pixels = @pixels.each_slice(3).to_a

作成した配列の長さは、元の画像の総ピクセル数とほぼ同じ長さだったので、勇気づけられました。ただし、ChunkyPNG を使用して RGB ピクセル配列を取得し、画像に印刷すると、ランダムなカラー ノイズのように見えます。入力されているバイトの一部が@pixelsメタデータを表している可能性はありますか? または、出力されるバイトは、個々の画像の R、G、B 値の順に並べられず、たとえば、すべての R バイト、次にすべての G バイト、次にすべての B バイトでしょうか?

バイト配列を、画像の RGB 値を論理的な順序でグループ化する配列の配列に変換する方法を理解したいと思います (左上から開始して右方向に作業するか、左上から開始して下方向に作業するなど)。

4

1 に答える 1

0

chunky_png gem はこれを行うことができます。https://github.com/wvanbergen/chunky_png

何かのようなもの:

img = ChunkyPNG::Image.from_file(@file)
img.pixels.each do |pixel|
 puts ChunkyPNG::Color.to_hex(pixel) # would spit out a hex string like "#b8e1f6ff"
end

異なる形式が必要な場合は、他にもいくつかの方法があります: to_grayscale、to_grayscale_alpha_bytes、to_grayscale_bytes、to_hex、to_hsb、to_hsl、to_hsv、to_s、to_truecolor_alpha_bytes、to_truecolor_bytes。

于 2018-09-08T16:44:50.127 に答える