In order to draw a single point you'll have to:
- obtain a portion of the image data
- calculate the index of the pixel in the image data
- set the RGB and alpha component of the pixel
- write back the data to the image
Getting a portion of the image data that can be processed and written back is a powerful procedure that allows for example to write image filters. However it's quite too complicated when you just want to draw one or more pixels.
Here is a real example:
// Get a reference to the canvas element
var elem = document.getElementById('canvas');
if (!elem || !elem.getContext) return;
// Get the 2D graphic context
var context = elem.getContext('2d');
if (!context) return;
// Obtain a portion of the graphic data
function get_image_data(context, w, h) {
// Not all browsers implement createImageData. On such browsers
// we obtain the ImageData object using the getImageData method.
// The worst-case scenario is to create an object *similar* to
// the ImageData object and hope for the best luck.
if (context.createImageData) {
return context.createImageData(w, h);
} else if (context.getImageData) {
return context.getImageData(0, 0, w, h);
} else {
return {'width' : w, 'height' : h, 'data' : new Array(w*h*4)};
}
}
// Draw a pixel on the canvas
function point(imgd, x, y) {
// Calculate the pixel offset from the coordinates
var idx = (x + (y * imgd.width)) * 4;
// Modify the graphic data
imgd.data[idx] = 0; // Red
imgd.data[idx+1] = 0; // Green
imgd.data[idx+2] = 0; // Blue
imgd.data[idx+3] = 255; // Alpha channel
}
var imgd = get_image_data(context, 400, 300);
point(imgd, i, j); // Replace i and j with real coordinates
context.putImageData(imgd, 0, 0);
Also possible to use the fillRect:
RépondreSupprimerc.fillStyle = "black";
c.fillRect(xPos,yPos,1,1);