0

我对 Ruby 或编程很陌生,所以请原谅我,如果我在这里的逻辑犯了“noob2 错误”。

我正在尝试使用 Chunky_PNG 为图像中的每个像素(及其位置)以二进制形式输出 rgba 像素值。

虽然输出是正确的,但它只显示第一行,似乎外部循环只运行一次。

它是否存在逻辑错误,或者while循环中的while循环永远不会起作用?这样做可能是不好的做法,我可以想象,但我仍然想知道为什么它不符合预期。

require 'chunky_png'
image = ChunkyPNG::Image.from_file('test.png')

#vars
$width0 = 0
$widthmax = image.dimension.width.to_i
$height0 = 0
$heightmax = image.dimension.height.to_i

#main
while $height0 < $heightmax  do
    while $width0 < $widthmax do 
        puts image[$width0,$height0].to_s(2)[0..7] + " " + image[0,0].to_s(2)[8..15] + " " + image[0,0].to_s(2)[16..23] + " " + $height0.to_s + "," + $width0.to_s
        $width0 += 1
    end
    width0 = 0
    $height0 += 1
end
4

2 回答 2

2

你错过了一个$

你有

width0 = 0

但是你想要

$width0 = 0

这具有永远不会将 $width0 重置为零的效果,因此仅输出第一行。它认为内部循环永远不必再次运行,因为$width0在第一次迭代之后的每次迭代中仍然处于最大值。

(我可能还应该补充一点,正如其他人所指出的那样,全局变量并不是最好的主意,但是您确实询问了脚本仅输出第一行的原因。:))

于 2013-05-05T20:02:57.500 回答
0

错误是 Ray Toal 解释的缺少 $ 符号

更容易使用

each

对于循环。那么你就不需要自己处理循环索引了

($height0..$heightmax).each do |height|
  ($width0..$widthmax).each do |width|
    puts image[width,height].to_s(2)[0..7] + " " + image[0,0].to_s(2)[8..15] + " " + image[0,0].to_s(2)[16..23] + " " + height.to_s + "," + width.to_s
  end
end
于 2013-05-05T23:01:44.213 回答