Javascriptのみを使用してカラー画像を白黒に変換するにはどうすればよいですか?
また、Internet Explorerには「フィルター」メカニズムがあると聞いていますが、他のブラウザーではサポートされていないため、ほとんどのブラウザーで相互互換性があります。
私の最初の懐疑論にもかかわらず、いくつかのブラウザで新しいCanvas機能を使用すれば、そのような魔法は確かに可能であるように思われます。
このページは、Canvasをサポートするブラウザを使用してそれを行う方法を示しています。
http://www.permadi.com/tutorial/jsCanvasGrayscale/index.html
IEフィルターを使用する必要がある場合、ここにグレースケールを実行する例があります。
私が行う方法は、サーバーサイドPHPスクリプト)を指すようにimgのsrcを設定することです。
例えば。、
<img src="http://mysite/grayscale.php?url='...'
そのスクリプトは画像をフェッチし、いくつかのGdコードを実行し、JPGを返します。何か このように
このjqueryプラグインはクロスブラウザで動作するようです。しかし、私はそれを徹底的にテストしていません。
HTML5CanvasとJavaScriptの使用
ctx.drawImage(img, 0, 0, w, h);
var imgPixels = ctx.getImageData(0, 0, w, h);
for(var y = 0; y < imgPixels.height; y++){
for(var x = 0; x < imgPixels.width; x++){
var i = (y * 4) * imgPixels.width + x * 4;
var avg = (imgPixels.data[i] + imgPixels.data[i + 1] + imgPixels.data[i + 2]) / 3;
imgPixels.data[i] = avg;
imgPixels.data[i + 1] = avg;
imgPixels.data[i + 2] = avg;
}
}
ctx.putImageData(imgPixels, 0, 0, 0, 0, imgPixels.width, imgPixels.height);
最近のブラウザは、CSSでこれを実行できるようになりました–anyHTML要素(画像だけでなく)。 IEの古いfilter
CSSと組み合わせると、かなり良い互換性を得ることができます。
image.grayscale {
/* IE */
filter: progid:DXImageTransform.Microsoft.BasicImage(grayscale=1);
/* Chrome, Safari */
-webkit-filter: grayscale(1);
/* Firefox */
filter: grayscale(1);
}
OPは「JavaScriptのみ」を指定していますが、IEのfilter
がより広くサポートされていれば受け入れられると述べていますが、現在は(事実上)サポートされているので、これが2015年の最善の解決策だと思います。 JavaScriptを持っている:
element.style.filter = 'grayscale(1)';
出典:
このコードは、ネストされたループや追加のライブラリを必要とせずに完璧に実行されると思います
var image = document.getElementById("image");
var canvas=document.createElement("canvas");
var ctx=canvas.getContext("2d");
canvas.width= image.width;
canvas.height= image.height;
ctx.drawImage(image,0,0);
var imageData=ctx.getImageData(0,0, image.width, image.height);
for (var i=0;i<imageData.data.length;i+=4) {
var avg = (imageData.data[i]+imageData.data[i+1]+imageData.data[i+2])/3;
imageData.data[i] = avg;
imageData.data[i+1] = avg;
imageData.data[i+2] = avg;
}
ctx.putImageData(imageData, 0, 0, 0, 0, imageData.width, imageData.height);
document.getElementById("grayscale").appendChild(canvas);
私はこの( http://spyrestudios.com/html5-canvas-image-effects-black-white/ )ソリューションがIEの外でかなりうまく機能することを発見しました。これは、他の人が指摘しているように、にフィルタを使用する必要があります。
Canvasは確かにこの問題に対する最良のクライアント側ソリューションであり、IEの場合、canvasコマンドを独自のMicrosoftXMLベースのベクトル言語であるVMLに変換するgoogleexCanvasプロジェクトを実際に使用できることを指摘したいと思います。
一部の画像フィルターはCSSで使用でき、すべての主要なブラウザーでサポートされていますが、HTML5CanvasとJavascriptを使用してさらに多くのオプションを使用できます。
ただし、Canvasベースの画像フィルタリングを使用する場合は、フィルターアルゴリズムを自分で実装する必要はありません。画像処理またはCanvas操作ライブラリを使用するだけです。
例:
以下の例では、MarvinJを使用しました。
画像の読み込み:
image = new MarvinImage();
image.load("https://i.imgur.com/B33rKWi.png", imageLoaded);
グレースケール:
Marvin.grayScale(image.clone(), image);
白黒:
Marvin.blackAndWhite(image.clone(), image, 5);
白黒2:
Marvin.blackAndWhite(image.clone(), image, 40);
ハーフトーン:
Marvin.halftoneErrorDiffusion(image.clone(), image);
実行可能な例:
var canvas = document.getElementById("canvas");
image = new MarvinImage();
image.load("https://i.imgur.com/B33rKWi.png", imageLoaded);
function imageLoaded(){
// GrayScale
//Marvin.grayScale(image.clone(), image);
//image.draw(canvas);
// Black and White
Marvin.blackAndWhite(image.clone(), image, 5);
image.draw(canvas);
// Black and White 2
//Marvin.blackAndWhite(image.clone(), image, 40);
//image.draw(canvas);
// Error Diffusion
//Marvin.halftoneErrorDiffusion(image.clone(), image);
//image.draw(canvas);
}
<script src="https://www.marvinj.org/releases/marvinj-0.7.js"></script>
<canvas id="canvas" width="400" height="400"></canvas>