2013-05-05 147 views
0

while循环我relativly新Ruby或编程好,所以请原谅我,如果我在拍“noob2错误与这里的逻辑。while循环在红宝石

我试图使用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 
+0

为什么你使用全局变量(即带有'$'前缀的变量)? – 2013-05-05 20:03:48

+0

Globals是教程中使用的第一种类型的血统书我抬头,所以我想他们是第一选择 – x3nu 2013-05-05 20:34:19

+3

我建议你找到一个更好的教程。 – 2013-05-05 20:38:10

回答

2

你缺少一个$

你有

width0 = 0 

但是你要

$width0 = 0 

这有永不复位$ width0回零的效果,所以只第一行是输出。它认为内部循环不必再次运行,因为$width0在第一次迭代之后的每次迭代中仍然处于其最大值。

(我也许应该补充一点,全局是不是最好的办法,正如其他人指出的那样,但你没有问为什么脚本只输出第一行的原因。:))

+0

谢谢。 (一个错字,对我很耻辱......) – x3nu 2013-05-05 20:30:06

0

的错误是由雷特里解释失踪$符号

即使就越容易使用

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 
+0

因为你使用了包含范围,所以你的每个变体都不相同。因为我们从0开始索引,所以使用'times'更方便:'heightmax.times {| h | widthmax.times {| w |放图像[w,h] ...}}' – dbenhur 2013-05-06 00:41:55