所以我尝试使用PIL绘制一些RGB值来创建图像。
我用于绘图的代码如下:
from PIL import Image, ImageDraw
class DrawDisplay(object):
def __init__(self, size_x, size_y):
self.size_x = size_x #Length of the image
self.size_y = size_y #Width of the image
self.img = Image.new("RGB", (self.size_x, self.size_y)) #Creates the drawing canvas
def plot(self, xy, colour):
d = ImageDraw.Draw(self.img)
d.point(xy, colour) #xy is co-ordinate in form of tuple, colour is rgb value in form of tuple
def write(self, filename):
self.img.save(filename) #Saves image with the variable filename as the name
我知道上面的代码没有问题,因为我已经用以下代码进行了测试:
dd = DrawDisplay(64, 64) #Utilises the drawing class
for i in range(64):
for j in range(64):
r = i * 4 #Pretty colours
g = j * 4
b = 0
dd.plot((i, j),(r, g, b)) #Uses method from earlier with i and j as x and y
dd.write("testname.png") #Saves the image as testname
如果我点击我的文件夹中的testname.png
,我会得到漂亮漂亮的图片现在说我有一个无序数组,每个数字直到64 ^ 2或4096:
my_list = shuffle(range(4096))
现在这是我需要帮助的地方,我如何处理my_list
中的每个值以使用公式/函数获得xy坐标元组?
以下是查看此问题的另一种方法:
想象一下4x4网格。如果我将1放入此函数,我的输出将是(1,1)(或者(0,0),如果你想使这个问题更简单。)
1 2 3 4 #Visualised
1 1 - - -
2 - - - -
3 - - - -
4 - - - -
16作为输入将输出(4,4)(或(3,3)):
1 2 3 4
1 - - - -
2 - - - -
3 - - - -
4 - - - 16
7输出(3,2)(或(2,1)):
1 2 3 4
1 - - - -
2 - - 7 -
3 - - - -
4 - - - -
我的公式/功能是什么?
答案 0 :(得分:0)
我认为应该这样做:
def idx2point(idx):
return (idx/64,idx%64)
如果要从1而不是0开始计数,可以为每个坐标添加1。
答案 1 :(得分:0)
如果您有各种网格尺寸,那么这可以提供帮助。它不是最优雅的,但它有效
def fun(val, grid):
pos = []
for val in lst:
x = val//grid[1]
r = val%grid[1]
if(r==0):
pos.append([x, grid[1]])
else:
pos.append([x+1, val-(x*grid[1]])
return pos
答案 2 :(得分:0)
我有另一个计算坐标的函数:
from math import floor, sqrt
def f(num):
a = floor(sqrt(num))
if a**2 == num:
return (a, a)
b = (num - a**2 + 1) // 2
if num % 2 == a % 2:
return (b, a+1)
else:
return (a+1, b)
这给出了以下结果:
f(1)
>>> (1, 1)
f(9)
>>> (3, 3)
f(10)
>>> (4, 1)
f(11)
>>> (1, 4)
f(12)
>>> (4, 2)