質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

3489閲覧

【JavaScript】canvasで斜めの線を引くとぼやけてしまう

flandre

総合スコア10

canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2021/10/30 09:50

編集2021/10/30 09:59

canvasでstroke()を用いて斜めの線を引くと下画像のように薄い灰色のぼやけが生じてしまうのですが、これを防ぐ方法は何かないでしょうか
イメージ説明
イメージ説明

水平線の場合も線の幅が奇数の際にこのぼやけが生じましたが、そっちは座標を0.5ずらすことで解消できたのですが
斜め線のぼやけは座標をずらしてもアンチエイリアスを無効にしても解消できませんでした

ペイントツールによくある塗りつぶし機能を実装する上で、このぼやけのある部分は塗りつぶすことができず
下画像のようにぼやけた部分だけ浮かび上がってしまって困っています
イメージ説明
解消する方法をご存知の方がいましたらどうか教えて頂きたいです

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

自分でも試してみましたが、確かに斜めの線を引くとアンチエリアスがかかるようですね。。

Stack Overflow に同様の質問がありました。

■ Can I turn off antialiasing on an HTML <canvas> element?
https://stackoverflow.com/questions/195262/can-i-turn-off-antialiasing-on-an-html-canvas-element

ブレゼンハムのアルゴリズムを用いて自前で描画するという方法が紹介されていました。

■ Bresenham
http://members.chello.at/easyfilter/canvas.html

<参考>
■ ブレゼンハムのアルゴリズム - Wikipedia
https://ja.wikipedia.org/wiki/%E3%83%96%E3%83%AC%E3%82%BC%E3%83%B3%E3%83%8F%E3%83%A0%E3%81%AE%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0

投稿2021/10/30 10:30

cx20

総合スコア4648

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cx20

2021/10/30 10:40

あと、別の方法として「アルファ値を除去するSVGフィルタをfilterプロパティに設定する」というテクニックがあるようです。 ■ canvas stroke()をした時の線の縁をぼやけさせない様にする方法について https://ja.stackoverflow.com/questions/39927/canvas-stroke%E3%82%92%E3%81%97%E3%81%9F%E6%99%82%E3%81%AE%E7%B7%9A%E3%81%AE%E7%B8%81%E3%82%92%E3%81%BC%E3%82%84%E3%81%91%E3%81%95%E3%81%9B%E3%81%AA%E3%81%84%E6%A7%98%E3%81%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6
flandre

2021/10/30 11:10

回答して頂きありがとうございます! ブレゼンハムのアルゴリズムを用いた描画というのは、「1ピクセルぶん描画するだけならアンチエイリアスがかからないので、1ピクセルのみの描画を連続して行うことでアンチエイリアスのかからない線を引く」…という解釈で合ってるでしょうか? SVGというのものも今初めて知ったのですが、画像をこのSVGに変換してcanvasに描画すればSVGの機能を実質的にcanvasで使えるようになる、って感じなんでしょうか?とりあえず紹介して下さったSVGフィルタというのを調べて色々試してみようと思います
cx20

2021/10/30 11:50

> ブレゼンハムのアルゴリズムを用いた描画というのは、「1ピクセルぶん描画するだけならアンチエイリアスがかからないので、1ピクセルのみの描画を連続して行うことでアンチエイリアスのかからない線を引く」…という解釈で合ってるでしょうか? 概ねその認識で合っているかと思います。先ほどのブレゼンハムのアルゴリズムのサンプルだとピクセルの描画に fillRect() を使っているようでした。 function setPixel(x, y) {  context.fillStyle = 'black';  context.fillRect(x*zoom,y*zoom,zoom,zoom); } サンプルコードの解説はこちらにありました。 ■ The Beauty of Bresenham's Algorithm http://members.chello.at/easyfilter/bresenham.html
cx20

2021/10/30 11:53 編集

> SVGというのものも今初めて知ったのですが、画像をこのSVGに変換してcanvasに描画すればSVGの機能を実質的にcanvasで使えるようになる、って感じなんでしょうか? そんな感じのようですね。自分もこのあたりはあまり詳しくないです(というか先ほど知りました) Canvas の filter プロパティがあり、ここ色々なフィルタを指定できるようになっており、 url() の形式で指定すると、SVG のフィルタ要素が適用できる、という仕組みのようです。 ■ CanvasRenderingContext2D.filter https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/filter
flandre

2021/10/30 13:01

色々と丁寧に回答して頂きありがとうございます! まだ問題の解消には至れていないのですが、教えて頂いた情報をもとに自分なりに試行錯誤してみようと思います
flandre

2021/10/31 06:41

返信が遅れてしまって申し訳ありません たくさん情報を下さってありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問