サンプルはCodepenです。キャンバスのどこかをクリックするだけで(黒い枠線が表示されます)、紫色の星が描画されます。HTML5キャンバス.translateと.scaleによって画像にギザギザのエッジが発生する
ご覧のとおり、星のエッジがギザギザになっています。それは.translate
と.scale
と描かれています。 .translate
と.scale
がギザギザのエッジを引き起こしていることを証明するには、28行目(CodePen JavaScriptのセクション)に移動し、コメントを外します。キャンバスをクリックすると、星は.translate
と.scale
なしで描画されますが、エッジにギザギザがありません。
スターはAdobe Illustratorで描画され、300x300pxのPNG形式で書き出されます。
更新: 途中でPNG
を使用する必要があります。いいえJPG
、SVG
など
この問題を解決するにはどうすればよいですか?私がこれまで試したが、助けにはならなかった何
:
- は、Adobe Illustratorの一般設定でアンチエイリアシングをオフにし
- は、Adobe IllustratorのドキュメントRasterのアンチエイリアシングをオフにしおよびエフェクトの設定
- Illustratorのドキュメントラスタとエフェクトの設定で、300ppi(デフォルト)の代わりに72ppiを使用しました。
- ストロークこのストロークに0%の不透明度を持たせました。私はぎざぎざになっているのは境界/エッジだけだと思った。だから、ストロークは "不可視"だと思った。
canvas
は、不透明度0%のストロークをギザギザにするだけなので、ギザギザのように見えることはない。しかし、これはどちらもうまくいかなかった。私も、このJavaScriptの "ハック" を使用してみましたcanvas { image-rendering: crisp-edges; /* Older versions of FF */ image-rendering: -moz-crisp-edges; /* FF 6.0+ */ image-rendering: -webkit-optimize-contrast; /* Safari */ image-rendering: -o-crisp-edges; /* OS X & Windows Opera (12.02+) */ /*image-rendering: pixelated; // Awesome future-browsers */ image-rendering: optimize-contrast; -ms-interpolation-mode: nearest-neighbor; /*IE*/ }
:
context.webkitImageSmoothingEnabled = true; context.mozImageSmoothingEnabled = true; context.imageSmoothingEnabled = true; /// future
私はこれらのCSSを使用してみました
は "ハック" を提案しました
注: CodepenにあるすべてのコードをSafari、Firefox、Chrome上でローカルでCodepenですべて追加しようとしましたが、
あなたはビットマップデータをスケーリングしています。これらのギザギザのエッジを取り除く簡単な方法はありません。ビットマップデータを使用する代わりに、星をベクトルとして描画できますか? – mkaatman
より大きい.pngで始まり、最初に縮小してゆくので、歪みを少なくして拡大縮小します。ちょっとした歪みで、html5 canvasとsvgの両方のパスを拡大/縮小できます。 – markE
私はmarkEに同意します。このシェイプでは、コンテキスト描画操作を使用します。また、imagesmoothingenabledはデフォルトでtrueに設定されていますが、おそらくfalseに設定したかったでしょう。 – Kaiido