我正在嘗試使用2個畫布,我希望它們都接受放入它們的圖像,並使用鼠標點擊操作圖像。這是我正在處理的代碼。鼠標在多個畫布上的座標HTML5/Javascript
我有它,如果我只有'droppedImage'畫布的eventlisteners,它工作正常,只要我爲'changeImage'畫布放置處理程序,它就會看到第二個畫布並將座標報告爲第一個畫布,它不再顯示RGB值或更改第三個畫布'selectedColour'的背景
發佈此信息作爲我上牀睡覺時,如果有人給出答案或需要更多信息,我將在明天工作之前彈出更新。
window.onload = function() {
var droppedImage = document.getElementById("droppedImage"),
ctx = droppedImage.getContext("2d");
droppedImage.addEventListener("mouseup", mpos);
// init event handlers
droppedImage.addEventListener("dragenter", dragEnter, false);
droppedImage.addEventListener("dragexit", dragExit, false);
droppedImage.addEventListener("dragover", dragOver, false);
droppedImage.addEventListener("drop", drop, false);
var changeImage = document.getElementById("changeImage"),
ctx = changeImage.getContext("2d");
changeImage.addEventListener("mouseup", mpos);
// init event handlers
changeImage.addEventListener("dragenter", dragEnter, false);
changeImage.addEventListener("dragexit", dragExit, false);
changeImage.addEventListener("dragover", dragOver, false);
changeImage.addEventListener("drop", drop, false);
var selectedColour = document.getElementById("selectedColour");
function dragEnter(evt) {
evt.stopPropagation();
evt.preventDefault();
}
function dragExit(evt) {
evt.stopPropagation();
evt.preventDefault();
}
function dragOver(evt) {
evt.stopPropagation();
evt.preventDefault();
}
function drop(evt) {
evt.stopPropagation();
evt.preventDefault();
var files = evt.dataTransfer.files;
var count = files.length;
// Only call the handler if 1 or more files was dropped.
if (count >0)
importImage(files);
}
function mpos(e) {
var cX = 0,
cY = 0;
if (event.pageX || event.pageY) {
cX = event.pageX;
cY = event.pageY;
}
else {
cX = event.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
cY = event.clientY + document.body.scrollTop + document.documentElement.scrollTop;
}
cX -= droppedImage.offsetLeft;
cY -= droppedImage.offsetTop;
// ctx.fillRect(cX, cY, 2, 2);
alert("X co-ord : "+ cX +", Y co-ord : "+ cY);
var imageData = ctx.getImageData(cX, cY, 1, 1);
alert("Pixel 1: "+ imageData.data[0]+", "+imageData.data[1]+", "+ imageData.data[2]+", "+ imageData.data[3]);
selectedColour.style.backgroundColor = "rgb("+imageData.data[0]+","+imageData.data[1]+","+imageData.data[2]+")";
}
}
function importImage(files) {
var file = files[0];
var reader = new FileReader;
reader.onloadend = handleReaderLoadEnd;
reader.readAsDataURL(file);
function handleReaderLoadEnd(evt){
var canvas = document.getElementsByTagName('canvas')[0];
var ctx = canvas.getContext('2d');
var img = new Image;
img.src = event.target.result;
img.onload = function() {
width = img.width;
height = img.height;
var scaleX, scaleY, scale;
var scaledWidth, scaledHeight;
scaleX = width/canvas.width;
scaleY = height/canvas.height;
scale = scaleX > scaleY ? scaleX : scaleY;
scaledWidth = width/scale;
scaledHeight = height/scale;
ctx.clearRect(0,0, canvas.width, canvas.height);
ctx.drawImage(img, (canvas.width - scaledWidth)/2, (canvas.height - scaledHeight)/2, scaledWidth, scaledHeight);
}
}
}
明天我會看看這個,看看我如何繼續,感謝您的幫助。 – aldo
嗨本,我正在處理兩個圖像編輯類型的應用程序,但它會是兩個不同的圖像。所以我認爲我需要有兩個獨立的畫布,因爲這些圖像將在飛行中縮放以便在瀏覽器中顯示。我沒有將圖像上傳到服務器。我能想到的唯一方法就是如果我有一個大畫布並嘗試控制畫布內所選大小/區域的縮放比例。這聽起來更可行嗎?感謝您的幫助 – aldo
您可以做的是每個圖像有一個畫布;然後是第三個畫布來處理所有其他繪圖和事件函數。第一次放下圖像時,它將在一個畫布上,第二次在第二個畫布上。使用CSS通過'position:absolute'&'z-index'將畫布定位在彼此之上。希望有所幫助。 – Ben