[解決済み] javascriptのキャンバスで画像をリサイズする (スムーズ)
2022-07-31 21:30:48
質問
canvasで画像をリサイズしようとしているのですが、どのように平滑化するのかがわかりません。 フォトショップやブラウザなどでは、いくつかのアルゴリズム (バイキュービック、バイリニアなど) が使用されていますが、これらがキャンバスに組み込まれているかどうかはわかりません。
以下は私のフィドルです。 http://jsfiddle.net/EWupT/
var canvas = document.createElement('canvas');
var ctx = canvas.getContext('2d');
canvas.width=300
canvas.height=234
ctx.drawImage(img, 0, 0, 300, 234);
document.body.appendChild(canvas);
最初のものは通常のリサイズされた画像タグで、2番目のものはcanvasです。キャンバスの方が滑らかでないことに注目してください。どうすれば「滑らかさ」を実現できるのでしょうか?
解決方法は?
ダウンステップを使用すると、より良い結果を得ることができます。ほとんどのブラウザは はバイキュービックではなくリニア補間を使用しているようです。 を使用するようです。
(
更新
仕様に品質プロパティが追加されました。
imageSmoothingQuality
というプロパティが追加されました(現在は Chrome のみで利用可能です)。
スムージングなしまたは最近傍を選択しない限り、ブラウザは画像をダウンスケールした後、常に補間します。
バイリニアは 2x2 ピクセルを使用して補間を行うのに対し、バイキュービックは 4x4 を使用するので、ステップで行うことにより、結果の画像に見られるように、バイリニア補間を使用しながらバイキュービックの結果に近いものを得ることができます。
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
var img = new Image();
img.onload = function () {
// set size proportional to image
canvas.height = canvas.width * (img.height / img.width);
// step 1 - resize to 50%
var oc = document.createElement('canvas'),
octx = oc.getContext('2d');
oc.width = img.width * 0.5;
oc.height = img.height * 0.5;
octx.drawImage(img, 0, 0, oc.width, oc.height);
// step 2
octx.drawImage(oc, 0, 0, oc.width * 0.5, oc.height * 0.5);
// step 3, resize to final size
ctx.drawImage(oc, 0, 0, oc.width * 0.5, oc.height * 0.5,
0, 0, canvas.width, canvas.height);
}
img.src = "//i.imgur.com/SHo6Fub.jpg";
<img src="//i.imgur.com/SHo6Fub.jpg" width="300" height="234">
<canvas id="canvas" width=300></canvas>
リサイズの度合いにもよりますが、差が少ない場合は手順2を省略することができます。
デモでは、新しい結果が画像要素によく似ていることがわかります。
関連
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] あるJavaScriptファイルを他のJavaScriptファイルにインクルードするにはどうすればよいですか?
-
[解決済み] JavaScriptで現在のURLを取得する?
-
[解決済み] JavaScriptで要素のクラスを変更するにはどうすればよいですか?
-
[解決済み】JavaScriptの比較では、どちらの等号演算子(== vs ===)を使うべきですか?
-
[解決済み】オブジェクトからプロパティを削除する(JavaScript)
-
[解決済み] コールバック地獄とは何か、RXはそれをどのように、そしてなぜ解決するのか?
-
[解決済み] Chromeのwebkitインスペクタで「Unsafe JavaScript attempt to access frame with URL...」というエラーが継続的に発生する。
-
[解決済み] HTML要素にスクロールバーがあるかどうかをチェックする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] HTML5 Canvas Resize (Downscale) Image High Quality?
-
[解決済み] JSのDateからDay名
-
[解決済み] 配列からオブジェクトを生成する
-
[解決済み] Javascriptによるタッチスクリーンデバイスの検出
-
[解決済み] 文字列がすべて同じ部分文字列で構成されているかどうかを調べるにはどうすればよいですか?
-
[解決済み] WebStormで未解決の変数が大量にある場合の警告に対処する方法は?
-
[解決済み] 文字列がhtmlであるかどうかをチェックする
-
[解決済み] JavaScriptで長い配列を小さい配列に分割する方法
-
[解決済み] JavaScriptとLuaの微妙な違い [終了しました]
-
[解決済み] Chrome拡張機能:popup.htmlを強制終了させる