乱数のシードが同じなら、変換処理も逆変換処理も同じようにできるというのが秀逸。
#const kButtonY 30 ;ボタンのYサイズ // 画像を読み込む title "ImageEncode/Decode" dialog "*", 16, "*" if(stat == 0) :end picload refstr px = ginfo(12) :py = ginfo(13) // (0, 0)のRGB値からseedを作成する // 例えば#(123, 45, 67)の場合、seed = 123045067となる pget 0, 0 seed = ginfo_r * 1000000 + ginfo_g * 1000 + ginfo_b randomize seed // GUIを作成する // (元画像の上60ピクセルが隠れてしまうことに注意) objsize px, kButtonY pos 0, 0 button goto "変換", *encode pos 0, kButtonY button goto "逆変換", *decode stop *encode // 変換処理 for y, py - 1, 0, -1 for x, px - 1, 0, -1 p = rnd(x + 1) q = rnd(y + 1) // 座標(x, y)と(p , q)の色を入れ替える // ただし(0, 0)の点は選択しないようにする if(x + y == 0) :_continue if(p + q == 0) :_continue pget p, q r = ginfo_r g = ginfo_g b = ginfo_b pget x, y pset p, q color r, g, b pset x, y next next clrobj bmpsave "" + refstr + ".bmp" end *decode // pic1に変換された画像を代入する dim pic1, px, py for y, 0, py for x, 0, px pget x, y r = ginfo_r g = ginfo_g b = ginfo_b pic1(x, y) = r * 1000000 + g * 1000 + b next next // pic2に画像の逆変換先X・Y座標を代入する dim pic2, px, py, 2 for y, 0, py for x, 0, px pic2(x, y, 0) = x pic2(x, y, 1) = y next next // 逆変換処理 for y, py - 1, 0, -1 for x, px - 1, 0, -1 p = rnd(x + 1) q = rnd(y + 1) // 座標(x, y)と(p , q)におけるpic2の値を入れ替える // ただし(0, 0)の点は選択しないようにする if(x + y == 0) :_continue if(p + q == 0) :_continue temp = pic2(x, y, 0) pic2(x, y, 0) = pic2(p, q, 0) pic2(p, q, 0) = temp temp = pic2(x, y, 1) pic2(x, y, 1) = pic2(p, q, 1) pic2(p, q, 1) = temp next next // 結果を出力する for y, 0, py for x, 0, px color pic1(x, y) / 1000000, pic1(x, y) \ 1000000 / 1000, pic1(x, y) \ 1000000 \ 1000 pset pic2(x, y, 0), pic2(x, y, 1) next next clrobj bmpsave "" + refstr + ".bmp" end