PIL舍入错误

时间:2017-08-12 18:37:11

标签: python python-3.x numpy python-imaging-library

我无法使用Mandelbrot程序写入图像;它与"(maxx-minx)/ width"的舍入错误有关。与"(maxy-miny)/ width"相比较第31行,它导致501乘500的图片而不是500平方的图片。 ((宽+ 1)*长)不(宽*长)。 我该如何解决这个问题?

from PIL import Image
from cmath import *
from math import sqrt
from numpy import arange

width = 500
height = 500

minx = -0.752 #float(input("Please enter the minimum x value:"))
maxx = -0.748 #float(input("Please enter the maximum x value:"))
miny = 0.098 #float(input("Please enter the minimum y value:"))
maxy = 0.102 #float(input("Please enter the maximum y value:"))

gradient = Image.open("mandelbrot.png")
gradlist = list(gradient.getdata())

def testMandelbrot(x, y):
    z = 0 + 0j
    c = x + (y*1j)
    iter = 0
    while iter <= 69 and sqrt(z.real**2 + z.imag**2) < 4:
        z = (z*z) + c
        iter += 1
    if iter == 70:
        return (0, 0, 0, 255)
    else:
        return gradlist[int((iter - 1) * 140 / 70)]

img = Image.new('RGBA', (width, height), color=(255, 255, 255, 255))
image = [testMandelbrot(x, y) for y in arange(miny, maxy, (maxy-miny)/height) for x in arange(minx, maxx, (maxx-minx)/width)] #this line creates the error ((maxx-minx)/width) / (maxx - min) gives (width+1) not width
print(len(image), img.size)
img.putdata(image)
img.save("picture111.png", "PNG")

1 个答案:

答案 0 :(得分:2)

我建议使用numpy's linspace而不是arange。它将返回一个精确给定数量的均匀间隔样本的数组。

看到linspace(0.098, 0.102, 500, endpoint=False)正好是500分。如果要包含端点,可以省略endpoint=False或传递endpoint=True

使用endpoint=False如果生成另一个图像,其高度和宽度相同但偏移max_ - min_之间的差异,则结果将是相邻图块,具体取决于它将导致八个图像之一。

您的代码将是:

Y = linspace(miny, maxy, height, endpoint=False)
X = linspace(minx, maxx, width, endpoint=False)
image = [testMandelbrot(x, y) for y in Y for x in X]

我将数组命名为Y被重复使用len(X)次,因为高度和宽度都很小(500),它的成本并不高,并且有助于提高可读性。