2013-09-26 2 views
10

У меня есть png-изображение, которое я хочу преобразовать в серый цвет. Мне удалось преобразовать его в оттенки серого, но он также изменяет цвет для прозрачных аров изображения. Как изменить цвет, не меняя прозрачную область изображения?изменение цвета изображения на оттенки серого в html5

var canvas = document.getElementById('canvas'); 
var ctx = canvas.getContext('2d'); 
var img = new Image(); 
img.src = 'image.png'; 
ctx.drawImage(img, 0, 0); 

var imageData = ctx.getImageData(0, 0, 420, 420); 
var px = imageData.data; 

var len = px.length; 

for (var i = 0; i < len; i+=4) { 
    var redPx = px[i]; 
    var greenPx = px[i+1]; 
    var bluePx = px[i+2]; 
    var alphaPx = px[i+3]; 

    var greyScale = redPx * .3 + greenPx * .59 + bluePx * .11; 

    px[i] = greyScale; 
    px[i+1] = greyScale; 
    px[i+2] = greyScale; 
    px[i+3] = greyScale; 
} 

ctx.putImageData(imageData, 0, 0); 
+0

Хотя это не полностью поддерживается, в chrome вы можете использовать '-webkit-filter: grayscale (100%)' – andy

ответ

9

Alpha - это «не цвет». Вы должны скопировать его как есть, оставив прозрачную часть прозрачной. Просто удалите строку:

px[i+3] = greyScale; 
1

Я не полностью уверен, что цель этого, но так как этот вопрос также помечен «HTML5» Я предполагаю, что это может быть необходимо для целей, отличных от, например, библиотека обработки изображений. Если это не какой-то редактор изображений или игра HTML5, вам просто нужно преобразовать некоторые из ваших изображений в оттенки серого, например. при наведении курсора мыши, вы можете также использовать CSS:

.grayscale { 
    filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#grayscale"); /* Firefox 10+, Firefox on Android */ 
    filter: gray; /* IE6-9 */ 
    -webkit-filter: grayscale(100%); /* Chrome 19+, Safari 6+, Safari 6+ iOS */ 
} 

Если это не подходит, пожалуйста, напишите более подробную информацию о том, почему вам нужно сделать, это

+0

+1 к этому ответу, поскольку, хотя он не отвечает на точный вопрос, предлагаемое решение более стандартно чем сама оригинальная проблема. – opalenzuela

0

этого плагина (tancolor.js) делает подобную вещь, вы хотите добиться, вы можете попытаться проверить source code и есть intractive demo, чтобы вы могли проверить все.

Смежные вопросы