Project

General

Profile

Bug(バグ) #3062

リサイズ後の画像サイズが荒い

Added by 守 手嶋 over 7 years ago. Updated over 2 years ago.

Status:
Won't fix(対応せず)
Priority:
Normal(通常)
Target version:
Start date:
2012-05-24
Due date:
% Done:

0%

3.6 で発生するか:
Yes (はい)
3.8 で発生するか:
Yes (はい)

Description

Overview (現象)

Bug(バグ) #1931: 透過PNG画像が透過されずに背景が黒くなってしまう - OpenPNE 3 - OpenPNE Issue Tracking System
https://redmine.openpne.jp/issues/1931

の対策後、画像をリサイズした際に画質が荒くなるようになった。

Causes (原因)

#1931imagecopyresampled() の代わりに imagecopyresized() をコールするように変更されたことが原因だが、この変更は truecolor 画像に対してはおこなう必要がなかった。

Way to fix (修正内容)

#1931 でおこなわれた変更をより好ましい形に改善する形で、以下のような対処を実施した。

1. truecolor 時のみ PEAR::Image_Transform のオプションの scaleMethod を指定する (= imagecopyresampled() の代わりに imagecopyresized() をコールする)
2. save() 前の crop() はこれまでにリサイズをおこなわなかったときにのみ実行する

詳しくは https://redmine.openpne.jp/issues/3062#note-5 の記載内容を参考のこと


Related issues

Copied to OpenPNE 3 - Backport(バックポート) #3669: リサイズ後の画像サイズが荒い Fixed(完了) 2014-07-15
Copied to OpenPNE 3 - Backport(バックポート) #3677: リサイズ後の画像サイズが荒い Fixed(完了) 2012-05-24

Associated revisions

Revision 341f509d (diff)
Added by Kousuke Ebihara about 7 years ago

changed to set scaleMethod option only for non-truecolor image (e.g. well-used gif images) (refs #3062)

Revision a95f680b (diff)
Added by Kousuke Ebihara about 7 years ago

changed not to call crop() method twice (fixes #3062)

History

#1 Updated by Kousuke Ebihara about 7 years ago

  • Status changed from New(新規) to Invalid(無効)
  • Target version deleted (OpenPNE 3.8.x)

#3059 と重複です。

#2 Updated by Kousuke Ebihara about 7 years ago

  • Tracker changed from Enhancement(機能追加・改善) to Bug(バグ)
  • Status changed from Invalid(無効) to New(新規)
  • Target version set to OpenPNE 3.9.0-old
  • 3.6 で発生するか set to Yes (はい)

本チケットが重複しているとしていましたが、重複元の #3059 が複数の問題を扱っていたため、本チケットを「リサイズ後の画像サイズが荒い」という問題を対応するためのチケットとしてリオープンします。

それから本現象はバグとしてみなすべきです。トラッカーを変更します。

#3 Updated by Kousuke Ebihara about 7 years ago

  • Subject changed from リサイズ画像の品質を改善 to リサイズ後の画像サイズが荒い

#4 Updated by Kousuke Ebihara about 7 years ago

  • Status changed from New(新規) to Accepted(着手)
  • Assignee set to Kousuke Ebihara

引き受けます。

#5 Updated by Kousuke Ebihara about 7 years ago

#1931 では、最初に、 PEAR::Image_Transform のオプションの scaleMethod を pixel に設定することで現象を回避していました。これによってリサイズ時に imagecopyresampled() の代わりに imagecopyresized() がコールされることになりますが、それによって生じることについてまず説明します。

PHP にバンドルされている libgd のコードを確認したところ、 gdImageCopyResized() では出力が truecolor と明示されていない場合、アルファチャネル関連の処理を自動的におこないますが、 gdImageCopyResampled() ではそれがありません (truecolor と明示された場合のみ。 truecolor でない場合は gdImageCopyResized() への fallback がおこなわれる)。

つまり truecolor についての考慮を自前でしないのであれば、アルファチャネル情報を保持するために (truecolor であっても) imagecopyresampled() ではなく imagecopyresampled() を使う必要があります。しかし、この方針には本チケットで指摘されているように、拡大縮小後の画像が粗くなる傾向があるといった問題があります。

ではどうするべきかというと、

  • アルファブレンディングを無効に ( imagealphablending() ) し、
  • 完全なアルファチャネル情報を保持するよう ( imagesavealpha() ) にしたうえで、
  • リサイズの必要がある場合は imagecopyresampled() でリサイズをおこなう

必要があります。

実は PEAR::Image_Transform では、 truecolor 画像の場合はリサイズ時に (リサイズのためにパレット情報を構築する際に) 前二者は透過的におこなわれていました。

#1931 で問題になっていたのは、 リサイズしない場合に 画像が透過されないというものでした。これは実は単純な話で、 PEAR::Image_Transform によるリサイズがおこなわれない場合に前二者を満たしていなかったという現象だったようです。ただし、 a3c2edbf でおこなわれた scaleMethod の変更は、リサイズ処理を通らないためあまり意味がなく、 ab5cfd3a の、「PEAR::Image_Transform による画像パレット情報構築処理を実行させるために crop() メソッドをコールする」ことによってはじめて実質上の対策となりました (ただし crop() がリサイズ時に実質二回コールされてしまうのは過剰と言えます)。

ということで本チケットの問題への対策としては、

1. scaleMethod の指定を外し、
2. save() 前の crop() は活かす (が、未リサイズ時に限定したい)

が適切であるといえます。

しかし、「1. scaleMethod の指定を外し、」には問題があります。このオプションを外すことで、 PEAR::Image_Transform 側で画像が常に truecolor としてみなされてしまうようで、リサイズ時に GIF の透過情報が壊れるといった問題があるようです。

そこで、画像が truecolor でない場合にはリサイズ前と保存前に、この scaleMethod の指定をおこなっておく必要があります。

#6 Updated by Kousuke Ebihara about 7 years ago

  • Status changed from Accepted(着手) to Pending Review(レビュー待ち)
  • % Done changed from 0 to 50

更新履歴 a95f680bdbdebd254e17109d76496381f3c10bbc で適用されました。

#7 Updated by Kousuke Ebihara about 7 years ago

1. 非 truecolor 時のみ scaleMethod を指定する
2. save() 前の crop() はこれまでにリサイズをおこなわなかったときにのみ実行する

形で修正しました

#8 Updated by Kousuke Ebihara about 7 years ago

  • Description updated (diff)

#9 Updated by 守 手嶋 about 7 years ago

運営的な視点で考えると、「透過PNGは透過しなくなる」という方針をとっても、ユーザーは納得すると思います。

透過を使いたいユーザー<<<<<<綺麗な画像を求めるユーザー

という観点から。

透過画像判定ができる

透過画像を透過しない画像に変更してしまう(背景白にできるか?)

通常のイメージと一緒にResampleで縮小する

運営としては、これでも十分良いと思います。
透過画像の判定ができるか?背景白で一般画像に変換できるか?に、かかっていますが。

#10 Updated by 守 手嶋 about 7 years ago

と、、、書いているうちに修正コードが追加されてた!
ユーザー制約なく、解決できるならそれでバッチリです。

#11 Updated by Kousuke Ebihara about 7 years ago

  • 3.8 で発生するか set to Yes (はい)

#12 Updated by isao sano over 5 years ago

#13 Updated by 誠二 天重 over 5 years ago

#14 Updated by Shinichi Urabe about 5 years ago

  • Status changed from Pending Review(レビュー待ち) to Pending Testing(テスト待ち)
  • % Done changed from 50 to 70

レビューOK

#16 Updated by isao sano over 2 years ago

  • Status changed from Pending Testing(テスト待ち) to Won't fix(対応せず)
  • % Done changed from 70 to 0

OpenPNE 3.8.13 にて対応済みであったため、対応せずとします。

Also available in: Atom PDF