【发布时间】:2018-12-18 15:14:57
【问题描述】:
我有一个形状为 64x64x3 的 python 数组。因此 64 宽度、64 高度和 3 个 RGB 像素值。
如何在我的网站上呈现此像素阵列?
例如,有没有办法让<img> 标记读取像素数组而不是文件名?
使用 JavaScript 数组的解决方案也很好。
【问题讨论】:
标签: javascript python web
我有一个形状为 64x64x3 的 python 数组。因此 64 宽度、64 高度和 3 个 RGB 像素值。
如何在我的网站上呈现此像素阵列?
例如,有没有办法让<img> 标记读取像素数组而不是文件名?
使用 JavaScript 数组的解决方案也很好。
【问题讨论】:
标签: javascript python web
您可以使用<canvas> 元素并以编程方式呈现像素。
The MDN has a great article on canvas 给出了一个以编程方式读取和写入像素的示例。
var canvas = document.getElementById('rasterCanvas');
var ctx = canvas.getContext('2d');
// get current raster data
var imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
var data = imageData.data;
// prepare data
for(var i = 0; i < data.length; i++) {
data[i] = Math.random() * 255;
}
// draw newly modified pixels back onto the canvas
ctx.putImageData(imageData, 0, 0);
<canvas id="rasterCanvas" style="width: 100px; height: 100px; border: 1px solid red"></canvas>
【讨论】:
您需要先将数组保存到图像文件中,然后使用<img> 标签链接它。
这是一个使用 PIL 库的示例:
from PIL import Image
imageFile = Image.new('RGB', (len(myArray[0]), len(myArray)))
imageFile.putdata([tuple(p) for row in myArray for p in row])
imageFile.save("example.png")
【讨论】:
有关基于 Javascript 的完整答案,请参见下文。我选择了HTML5 Canvas,因为它易于使用,您可以在画布上设置单个像素。
注意:数组只有5x5x3,因为我是手工做的,但概念应该很明显。
var ctx = document.getElementById('imageCanvas').getContext('2d');
var imageData = [
[[255,0,0], [255,0,0], [255,0,0], [255,0,0], [255,0,0]],
[[0,255,0], [0,255,0], [0,255,0], [0,255,0], [0,255,0]],
[[255,0,0], [255,0,0], [255,0,0], [255,0,0], [255,0,0]],
[[0,255,0], [0,255,0], [0,255,0], [0,255,0], [0,255,0]],
[[255,0,0], [255,0,0], [255,0,0], [255,0,0], [255,0,0]],
];
for(var y = 0; y < imageData.length; y++){
for(var x = 0; x < imageData[y].length; x++){
ctx.fillStyle = `rgb(${imageData[y][x][0]}, ${imageData[y][x][1]}, ${imageData[y][x][2]})`;
ctx.fillRect( x, y, 1, 1 );
}
}
<canvas id="imageCanvas" width="64" height="64" style="border:1px solid #000000;">
</canvas>
【讨论】: