我正在编辑图像的Web应用程序,其中一部分包含html上的画布,我得到一个选择区域,该区域保存为下面的png示例图像
下一步是获取选择区域的x,y位置,因此我知道仅在此处应用效果的代码看起来像这样
pixels = img.load()
if cropped:
x, y = position['left'], position['top']
else:
x, y = 0, 0
img_width, img_height = 0, 0
matches = []
counter = 0
for _ in range(img.width * img.height):
if img_width == img.width:
img_width = 0
img_height += 1
counter += 1
pixel = pixels[img_width, img_height]
if pixel != (0, 0, 0, 0):
matches.append([img_width+y, img_height+x])
img_width += 1
if matches:
filename = random_filename(extension='.pickle')
with open(filename, 'wb') as f:
# Pickle the 'data' dictionary using the highest protocol available.
pickle.dump(matches, f, pickle.HIGHEST_PROTOCOL)
这将获取细胞并将其保存到泡菜中。
但是,当我对这些单元格应用效果时,会出现“晕轮效果”,其中选择线距主要选择区域的距离为
我确保不是应用效果出现问题,因为它仅使用指定区域,而不会。
我又走了一步,使用选择区域像素之一重建了png文件,以查看它是否有问题(应该这样做)
In [1]: from PIL import Image
In [14]: new = Image.new('RGB', (600, 399))
In [15]: import pickle
In [16]: pickle_file = open('pickle_cells/qPxsEaw7wcQR5YWK9iZrb6r.pickle', 'rb')
In [17]: cells = pickle.load(pickle_file)
In [18]: pickle_file.close()
In [20]: cells[0]
Out[20]: [259, 117]
In [22]: for cell in cells:
...: new.putpixel([cell[0], cell[1]], (50, 50, 50))
...:
In [23]: new.save('test.png')
In [24]:
这将创建显示相同错误的图像
答案 0 :(得分:2)
我认为问题在于您的PNG文件未包含您期望的文件。它具有41种独特的颜色-不是您可能期望的两种。
文件中的每个像素均为黑色,背景为白色。查看此分析中红色标记的部分:
41种黑色阴影完全由alpha通道的变化表示。看一下这些颜色的直方图,所有颜色的R = 0,G = 0,B = 0,但alpha通道变化很大。
我建议对alpha通道设置阈值。
我使用 ImageMagick 生成了上述分析-大多数Linux发行版中都包含了该分析,并且适用于macOS和Windows。只需在命令行上:
magick identify -verbose image.png
或者,如果使用的是v6或更早版本,请放下magick
并运行:
identify -verbose image.png
答案 1 :(得分:0)
有趣的事情;这是由于使用抗锯齿造成的
img = img2.resize((full_width, full_height), PILImage.ANTIALIAS)
正是导致问题的原因。