画像アップロードサイズ・リサイズに関する質問

このトピックと、こちら、そしてこちらを読んだ後、Discourse が大きな画像をどのように処理しているのか、いまだに完全には理解できていません。私の以前の理解では、ソフトウェアによるリサイズは行われず、CSS による調整のみが行われるものでした。つまり、画像サイズは「最大画像アップロードサイズ(kB)」によって制限され、それ以上はアップロードできないというものでした。もし大きな画像がリモートファイルであればリンクとして扱われ、そうでなければアップロード自体が不可能になります。

しかし、これらのトピックで「ダウンサイジング」や「最適化」について言及されているのを見て、混乱しています。これまで実際にそのような処理が行われているのを見たことがないため、そのような処理は行われていないと思っていたからです。また、「画像に対して許可される最大メガピクセル数」という制限が何に適用されるのかもわかりません。これは、それを超えるサイズの画像のアップロードを阻止するのでしょうか?それとも、最大アップロードサイズ以下であれば、その制限を超える画像はリサイズされるのでしょうか?

もし後者であるなら、なぜデフォルト設定でメガピクセルの制限が、デフォルトの最大アップロードサイズに対してこれほど巨大なのでしょうか?4096 kB 未満の 51 メガピクセル画像を投稿したいと思う人がいるとは、極めて考えにくいです。


私が望んでいるのは、ユーザーがファイルサイズや解像度を気にせず、手元にあるものを簡単にアップロードできるようにすること、そしてソフトウェアがモバイルユーザーや低速回線のユーザーを困らせることのない適切な画像を提供することです。これは現在、「最大画像サイズ」と「最大メガピクセル数」を調整するだけで実現可能でしょうか?

これはすべて、設定なしで動作します:

:arrow_double_up: のソースを表示を右クリックすると、画像は小さいことがわかります。クリックすると、フル解像度の画像が表示されます。

では、max uploadを 10 MB に、max megapixelを 12 に変更した場合、ユーザーが 7 MB の 16 メガピクセル画像をアップロードしようとしたらどうなるのでしょうか?

デフォルト設定では、新しいスマートフォンで撮影された写真の相当割合が 4096 kB を超えていますが、40 メガピクセルにはほど遠いものです。

まだ、どのような場合にどうなるのか、あるいはなぜデフォルト値がそのように設定されているのかが理解できていません。

設定を試してみるのがおすすめです。設定を変更し、大きな画像をアップロードして、どのような反応が返ってくるか確認してみましょう。

はい、それに対応できます。ただし、ソフトウェアが実際に何をしているのかを理解し、より適切な判断を下せるようにしたいと考えています。Discourse を使用している期間を通じて、デフォルト設定を尊重し、必要不可欠な場合のみ変更するよう学びました。今回のケースでは、デフォルト設定が比較的典型的なコミュニティにとってあまり機能していないため、なぜそのように設定されているのか、代わりにどのような妥当な値を検討すべきか、またそれらの変更を行った際にどのような影響が生じるのかについて、興味を持っています。

コードを確認すると、最大メガピクセル数は厳格な制限です。これは、システムが縮小の判断に使用するものではなく、安全スイッチです。

max_image_size_kb が、アップロード時の自動縮小を決定する唯一の要因です。

ホストしたい最大のメガピクセル数まで、最大メガピクセル数を引き上げてください。

いくつかのボタンを連打して様子を伺った結果、以下のように考えています:

  • デフォルトのインストール状態では、client_max_body_sizemax image size kb が等しい場合、画像はリサイズされません。

  • client_max_body_size を増やすと、より大きなアップロードが可能になり、Discourse は max image size kb で設定された制限内で画像のリサイズを試みます。

  • 説明からは逆のように思えますが、max image size kb は実際にはアップロードサイズを制限しません(これは非常に混乱します!)。

  • アップロードサイズは、nginx の client_max_body_size のみで設定されます。

  • リサイズ時:

    • JPEG は良好な結果で JPEG のままです。
    • PNG は許容範囲の結果で JPG に変換されます。
    • アニメーション GIF は概して結果が劣るものの、GIF のままです。

これはすべて正しいでしょうか?もしそうなら、これはもう少し詳しく説明されるべきだと思います。なぜなら、初期状態のインストールでは画像のリサイズが行われないにもかかわらず、多くの人が求める機能であり、それを有効にする方法が利用可能なドキュメントからは全く明確ではないからです。

ふむ、GitHub の nginx.sample.conf を見てみると、client_max_body_size のデフォルト値が 4 MB から 10 MB に変更されているようです。これは以前からそうだったのでしょうか?今日以前に、自分のインストール環境でこのファイルを編集した覚えはありません。

徹底的なテストをありがとうございます。確認したところ、実際にご指摘の通り動作しているようです。

最大ボディサイズはしばらく 10 のままですが、おそらく 20 に引き上げるべきでしょう。

サイトの設定説明を改善すべきという点に同意します。本日中に実施いたします。

編集:

ドキュメントが以下のように更新されました:

https://review.discourse.org/t/doc-improve-documentation-of-image-limit-site-settings/9303

こんにちは、Sam。
説明を見る限り、私の環境では動作していないようです。

  • max_image_size_kb: “アップロード可能な画像の最大サイズ(kB 単位)。これは nginx(client_max_body_size)、Apache、またはプロキシ側でも設定する必要があります。この値より大きく、かつ client_max_body_size より小さい画像は、アップロード時にリサイズされます。”
  • max_image_megapixels: “画像に許可される最大メガピクセル数。これを超えるメガピクセル数の画像は拒否されます。”

少なくとも、リサイズが試行されている様子はありません。

max_image_size_kb1000kb に設定し、それをわずかに超える画像をアップロードしたところ、画像の代わりにリンクが表示され、その後に「(image larger than 1000KB)」というテキストが続きました。

設定を 500kb に変更しても、同じ現象が発生しました。

NGINX の client_max_body_size は変更していません(デフォルトの 4096 だと想定しています)。

これはホットリンクされた画像での話ですが(「リモート画像をローカルにダウンロード」がチェックされている場合、標準的なアップロードと同様に扱われると想定されます)。
(もしそうでない場合、同じように動作するように変更していただけますか?)

編集: 直接アップロードするとリサイズが機能することが確認できました!つまり、問題が発生しているのは取得されるリモート画像だけですね。理想的な動作が何なのかは正直わかりませんが、最初の考えとしては、これらのリモート画像もリサイズされるべきだと思われます。

これは別の機能リクエストだと思います。確かに、最大画像サイズを 200KB まで引き下げれば、ホットリンクされた画像をダウンロードする際にリサイズするのは完全に理にかなっています。いくつかの閾値が関与しており、この問題を特定するために 700GB の画像をダウンロードするべきではありませんが、確かに改善の余地はあります。

サム、同意見です。正直なところ、ダウンロードされたホットリンク画像が同じルールに従わない理由が思いつきません。


また、最大画像サイズを変更すると、最終的に得られるファイルサイズにも影響することがわかりました。これはとても素晴らしいですね!500kbに設定すると1.2mbの画像が360kbにリサイズされ、200kbに設定すると同じファイルが118kbになりました :+1:(もちろん、サイズも小さくなります)。

編集: ああ、でもまたあの元の問題に戻ってしまいました。リサイズするには大きすぎる画像が以下のようなエラーで失敗するのです:

lib/discourse.rb:57:in `exec': convert: improper image header `/tmp/image20200228-23391-t365z9.jpg' @ error/png.c/ReadPNGImage/4294.

DCが常にリサイズを行う方法はないでしょうか?たとえ画像が極端に小さくなってしまってもです?


これは当フォーラムのデフォルト設定です。20000に変更しようと試みましたが、変更が反映された(ように見えた)ものの、17.2MBの画像/GIFをアップロードしようとしたところ、以下のエラーメッセージが表示されました。


Linuxで「client_max_body_size」をNginxで変更するには、どのパス(どのコマンドを入力すればよいか)に進めばよいでしょうか?私はDigitalOceanのDropletを使用しています。

これは、デフォルト値が近日中に4096から20000に変更されることを意味するのでしょうか?

素晴らしいです、@riking!ありがとう、仲間よ!

/var/discourse には共有フォルダしか含まれていません。おっしゃるファイルが見つかりません。私の問題は、Discourse の新規インストールを行ったにもかかわらず、投稿への画像アップロードが全く機能しないことです。管理者としてでも、「申し訳ありませんが、ファイルのアップロード中にエラーが発生しました。もう一度お試しください。」というエラーが表示されます。何度試しても同じエラーになります。

エラーログには以下が表示されています:

MaxMindDB (/var/www/discourse/vendor/data/GeoLite2-ASN.mmdb) が見つかりません:No such file or directory @ rb_sysopen - /var/www/discourse/vendor/data/GeoLite2-ASN.mmdb

Discourse は「テキストのみ」のディスカッショングループとして設計されているのでしょうか?最大アップロードサイズの設定を異常なほど大きな値にまで引き上げましたが、7KB の画像さえもアップロードできません。

/var/discourse に何もなければ、古いインストールかもしれません。/var/docker も確認してください。

そうですね、再ビルドを試してみてください。mmdb キーが存在しない場合の処理が正しく行われていない古いベースイメージを使用している可能性があります。

はい、これらのフォルダは以下のようになっています。


再構築の方法がわかりません。ご教示ください。これは VM 上の新規インストールで、エラーは全く発生していません。グラフィック以外は何も問題なく動作しているようです。

Jay がここで尋ねている通り:Uploading Files to Discourse - #3 by pfaffman
Discourse 公式の標準インストールを行いましたか?