2015-08-25 1 views
0

Я использую HTML canvas, чтобы получить изображение в оттенках серого, и я не хочу просто усреднять его. Поэтому я использую эту функциюКак установить альфа-канал в холсте при гранулировании

var imageData = ctx.getImageData(0,0,canvas.width, canvas.height); 
    var data= imageData.data 
    for (var i = 0; i < data.length; i += 4) { 
     var grayscale = (data[i]*0.2126 + data[i +1]*0.7152 + data[i +2])*0.0722; 
     data[i]  = grayscale; // red 
     data[i + 1] = grayscale; // green 
     data[i + 2] = grayscale; // blue 
    } 
    ctx.putImageData(imageData, 0, 0); 
} 

Проблема, однако, если изображение имеет белый фон, оно будет превращено в черный. Так что попробовал data[i + 3] = 255; для альфа-канала, но это превратило весь холст в черный.

Что я делаю неправильно?

ответ

2

Проблема заключается в этой строке:

var grayscale = (data[i]*0.2126 + data[i +1]*0.7152 + data[i +2])*0.0722; 

Заметим, что последние постоянные умножает весь expresion слева от него, в то время как он должен только приумножаться data[i+2]:

var grayscale = data[i]*0.2126 + data[i + 1]*0.7152 + data[i + 2]*0.0722; 

jsfiddle

+0

FML, я ноот! Благодаря! Поэтому мне было интересно, есть ли способ отделить только один канал в холсте. Подобно IMagick 'convert myfile.jpg -channel B -separate myfileR.jpg' – Tom

+0

Ну, используйте тот же код, что и выше, просто установите каналы, которые вам не нужны. –

+0

ОК, что работает, но теперь, если я в оттенках серого он снова превращает белое пространство в черный – Tom

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