From 802dd4b1f3ba4a0f539094aa33b91bd7f47d2ee0 Mon Sep 17 00:00:00 2001 From: Johannes 'josch' Schauer Date: Wed, 3 Jun 2020 00:15:55 +0200 Subject: [PATCH] magick.py: prevent floyd_steinberg() from modifying its input --- magick.py | 25 +++++++++++++------------ test.sh | 10 +++++----- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/magick.py b/magick.py index 72a43e3..1a074a1 100755 --- a/magick.py +++ b/magick.py @@ -17,20 +17,21 @@ def find_closest_palette_color(color, palette): def floyd_steinberg(img, palette): - for y in range(img.shape[0]): - for x in range(img.shape[1]): - oldpixel = img[y, x] + result = numpy.array(img, copy=True) + for y in range(result.shape[0]): + for x in range(result.shape[1]): + oldpixel = result[y, x] newpixel = find_closest_palette_color(oldpixel, palette) quant_error = oldpixel - newpixel - img[y, x] = newpixel - if x + 1 < img.shape[1]: - img[y, x + 1] += quant_error * 7 / 16 - if y + 1 < img.shape[0]: - img[y + 1, x - 1] += quant_error * 3 / 16 - img[y + 1, x] += quant_error * 5 / 16 - if x + 1 < img.shape[1] and y + 1 < img.shape[0]: - img[y + 1, x + 1] += quant_error * 1 / 16 - return img + result[y, x] = newpixel + if x + 1 < result.shape[1]: + result[y, x + 1] += quant_error * 7 / 16 + if y + 1 < result.shape[0]: + result[y + 1, x - 1] += quant_error * 3 / 16 + result[y + 1, x] += quant_error * 5 / 16 + if x + 1 < result.shape[1] and y + 1 < result.shape[0]: + result[y + 1, x + 1] += quant_error * 1 / 16 + return result def convolve_rgba(img, kernel): diff --git a/test.sh b/test.sh index f8495a3..f33e036 100755 --- a/test.sh +++ b/test.sh @@ -114,16 +114,16 @@ fi cat << END | ( cd "$tempdir"; md5sum --check $status_arg - ) cc611e80cde3b9b7adb7723801a4e5d4 alpha.png 706175887af8ca1a33cfd93449f970df gray16.png -198e3333d7dc6158f94d1007e75c5bd3 gray1.png -795ff9c5c59cdc95f5a0b9191a7247d9 gray2.png +ff4d9f18de39be879926be2e65990167 gray1.png +d51900476658a1c9dd26a7b27db8a21f gray2.png 722223ba74be9cba1af4a549076b70d3 gray4.png 2320216faa5a10bf0f5f04ebce07f8e1 gray8.png 35a47d6ae6de8c9d0b31aa0cda8648f3 inverse.png 6ad810399058a87d8145d8d9a7734da5 normal16.png c8d2e1f116f31ecdeae050524efca7b6 normal.png -c69edd665ee3546d9eb57fe10cd8095a palette1.png -504ecab83662aa2394042a62b1d2eafb palette2.png -90d1bbe7b26e210d8846cf8692a98b72 palette4.png +18a3dfca369f976996ef93389ddfad61 palette1.png +d38646afa6fa0714be9badef25ff9392 palette2.png +e1c59e68a68fca3273b6dc164d526ed7 palette4.png 50bf09eb3571901f0bf642b9a733038c palette8.png END