我目前正在尝试获取纹理图像的 RGB 数据,同时向用户显示纹理的预览。
用户将图像文件放入表单中,它应该显示图像的预览,同时将图像绘制到画布以获取每个像素的 RGB 值:
handleTextureImageDrop = (e) ->
e.stopPropagation()
e.preventDefault()
if e.dataTransfer.files.length >= 1
file = e.dataTransfer.files[0]
if file
reader = new FileReader()
reader.onload = (loadEvent) ->
img = $ '<img/>'
img.attr
src: loadEvent.target.result
$(e.target).html img
reader.onloadend = (loadendEvent) ->
img = $(e.target).children 'img'
width = img.width()
height = img.height()
canvas = $ '<canvas/>',
width: width
height: height
$('#wrapper').append canvas
context = $('canvas').get(0).getContext '2d'
context.drawImage img.get(0), 0, 0
rgb = (for x in [0...width]
for y in [0...height]
context.getImageData(x, y, 1, 1).data)
canvas.remove()
TEXTURE_FILES.push
image: file.name
rgb: rgb
reader.readAsDataURL file
就目前而言,它大约有 50% 的时间工作,但其余时间width
并height
设置为0
,因此像素数据的迭代永远不会发生。
<img/>
这将向我表明,在图像尚未加载到标签中的情况下发生了某种竞争情况。
这就是正在发生的事情吗?还是我错过了一些愚蠢而明显的东西?
任何帮助将非常感激。