2016-02-01 17 views
5

サンプルはCodepenです。キャンバスのどこかをクリックするだけで(黒い枠線が表示されます)、紫色の星が描画されます。HTML5キャンバス.translateと.scaleによって画像にギザギザのエッジが発生する

ご覧のとおり、星のエッジがギザギザになっています。それは.translate.scaleと描かれています。 .translate.scaleがギザギザのエッジを引き起こしていることを証明するには、28行目(CodePen JavaScriptのセクション)に移動し、コメントを外します。キャンバスをクリックすると、星は.translate.scaleなしで描画されますが、エッジにギザギザがありません。

スターはAdobe Illustratorで描画され、300x300pxのPNG形式で書き出されます。

更新: 途中でPNGを使用する必要があります。いいえJPGSVGなど

この問題を解決するにはどうすればよいですか?私がこれまで試したが、助けにはならなかった何


  1. は、Adobe Illustratorの一般設定でアンチエイリアシングをオフにし
  2. は、Adobe IllustratorのドキュメントRasterのアンチエイリアシングをオフにしおよびエフェクトの設定
  3. Illustratorのドキュメントラスタとエフェクトの設定で、300ppi(デフォルト)の代わりに72ppiを使用しました。
  4. ストロークこのストロークに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*/ }

  5. context.webkitImageSmoothingEnabled = true; context.mozImageSmoothingEnabled = true; context.imageSmoothingEnabled = true; /// future


私はこれらのCSSを使用してみました
  • は "ハック" を提案しました

    注: CodepenにあるすべてのコードをSafari、Firefox、Chrome上でローカルでCodepenですべて追加しようとしましたが、

  • +0

    あなたはビットマップデータをスケーリングしています。これらのギザギザのエッジを取り除く簡単な方法はありません。ビットマップデータを使用する代わりに、星をベクトルとして描画できますか? – mkaatman

    +0

    より大きい.pngで始まり、最初に縮小してゆくので、歪みを少なくして拡大縮小します。ちょっとした歪みで、html5 canvasとsvgの両方のパスを拡大/縮小できます。 – markE

    +0

    私はmarkEに同意します。このシェイプでは、コンテキスト描画操作を使用します。また、imagesmoothingenabledはデフォルトでtrueに設定されていますが、おそらくfalseに設定したかったでしょう。 – Kaiido

    答えて

    0

    星をベクトルに変更すると、問題が解決します。

    star_img.src='data:image/svg+xml;utf8,<svg width="300px" height="275px" viewBox="0 0 300 275" xmlns="http://www.w3.org/2000/svg" version="1.1"><polygon fill="#fdff00" stroke="#605a00" stroke-width="15" points="150,25 179,111 269,111 197,165 223,251 150,200 77,251 103,165 31,111 121,111" /></svg>'; 
    

    http://codepen.io/anon/pen/QyBGMv

    +0

    こんにちは@ mkaatman、ありがとう。しかし、1.私はsvgのbecを使用することを控えました。 タグ(ポップアップウィンドウ内)に同じ.src URLを使用します。このタグは、幅と高さのスタイルプロパティを持つものとして定義しました。幅と高さを設定することで、キャンバスに描画される変数は非常に小さく縮小されます。これはSafariでのみ発生し、それほど知られていないSafariのバグです。 2.私はあなたのコードペンを開き、何も描かれません。 3.私は前に 'SVG'を使って試してみました。そして、ギザギザのエッジもそこにありました。 – junerockwell

    +0

    BTW、html5キャンバスの描画コマンドは、キャンバスの描画面に擬似ビットマップとして描画される実際のベクトルコマンドです(SVGは同じことを行います:ビットマップのスクリーンにベクトルとレンダリングを発行します)。したがって、SVGのように歪みの少ない描画と拡大縮小を行うことができます。 ;-) – markE

    +0

    私はcodepenを更新しました。私はそれがサファリで動作するかどうかはわかりませんが、隠れたdivでSVGをプリロードすると、インラインSVGを使うことができます。そうでなければ、星をキャンバスに直接描画する必要があります。 – mkaatman

    関連する問題