Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

サムネイル画像をOGP画像用のサイズに合わせる #6483

Open
wants to merge 12 commits into
base: main
Choose a base branch
from

Conversation

wata00913
Copy link
Contributor

@wata00913 wata00913 commented May 1, 2023

Issue

概要

ブログ記事のサムネイル画像をアップロードする際に、自動で1200px x 630pxに加工する機能を追加しました。サイズ1200px x 630pxはOGP画像に適したサイズとなります。

今後、他の画面でもOGP画像用に加工する機能を使うため、モジュール化して共通利用出来るようにしました。

画像の加工方法

画像の加工方法は2つの手順があります。

  1. 拡大・縮小操作(詳細なルールについては以下のリンクを参照)
  2. 手順1.で変形した画像を中心から1200px x 630pxで切り抜く

ImageMagicの参考文献

画像の加工は、ImageMagicのコマンド・オプションをActiveStorage::Attachment#variantの引数に指定することで実現します。
コマンド・オプションの検討には以下の記事が参考になりました。

その他参考文献

Ruby on Railsで定数の指定 #Ruby - Qiita

変更確認方法

  1. feature/fit-to-size-for-ogp-thumbnailsをローカルに取り込む
  2. komagataでログインする
  3. ブログ記事作成画面/articles/newにアクセスする
  4. 入力項目「タイトル」と「本文」に任意の文字を入力する
  5. 任意のサイズの画像をアップロードし、ブログ記事を登録する
  6. 手順5.で作成した記事/articles/{article_id}にアクセスする
  7. アップロードした画像をダウンロードする
  8. ダウンロードした画像のサイズが1200px x 630pxであることを確認する
  9. 「画像の加工方法」の手順通りに画像が加工されていることを確認する

Screenshot

画像の加工にて拡大操作をする画像

  • 変更前
    image

  • 変更後
    image

画像の加工にて縮小操作をする画像

  • 変更前
    image

  • 変更後
    image

@wata00913 wata00913 force-pushed the feature/fit-to-size-for-ogp-thumbnails branch from 9b59181 to 8770428 Compare May 1, 2023 05:23
@wata00913 wata00913 self-assigned this May 1, 2023
@wata00913 wata00913 marked this pull request as ready for review May 1, 2023 06:48
@wata00913 wata00913 requested a review from toke04 May 1, 2023 06:49
@wata00913
Copy link
Contributor Author

@syo-tokeshi
お疲れさまです!
こちらのレビューをお願いしたいのですが、ご都合はいかがでしょうか?

@wata00913 wata00913 changed the title サムネイル画像をOGP用のサイズに合わせる サムネイル画像をOGP画像用のサイズに合わせる May 1, 2023
@toke04
Copy link
Contributor

toke04 commented May 1, 2023

@syo-tokeshi お疲れさまです! こちらのレビューをお願いしたいのですが、ご都合はいかがでしょうか?

@wata00913
私でよければ全然大丈夫です😊
なるべく明後日までにお返事する形でよろしいでしょうか?

調査して、ちゃんとレビューするようにします😊
一緒に勉強する気持ちでやります!🙇‍♂️

@wata00913
Copy link
Contributor Author

@syo-tokeshi
ありがとうございます!

なるべく明後日までにお返事する形でよろしいでしょうか?

明後日でなくとも、ゆっくり返信して下さって大丈夫ですよ! 🙆‍♂️(GWですしね)

@@ -32,6 +32,8 @@ def create
@article.user = current_user if @article.user.nil?
set_wip
if @article.save
Ogp::Image::AttachmentProcessor.fit_to_size(@article.thumbnail) if @article.thumbnail.attached?
Copy link
Contributor

@toke04 toke04 May 1, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fit_to_size
こちら、リサイズしようとしているので、他の名前が良いと思いました!

私が考えた候補として、

  • resize_to_standard_size
  • resize

です。
resizeだけでも良い気がしてきました、、(standard_sizeという言葉を付けると、何を基準に標準?って疑問が生まれる気がしました)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

resizeの場合、単純に画像のサイズを変更するだけなので命名として物足りないかなぁと考えております。

こちらのメソッドは、サムネイル画像をOGP画像として表示するために最適な加工処理を行うものです。最適な加工処理とは、今回の場合はリサイズすることと切り抜きになります。

fitは、語源の「整える」から 適合する適したぴったり合う という意味になります。
そのため、メソッドの役割が「OGP画像に適するように画像を加工する」ことを表現するのにfitを採用するのが妥当と判断しています。
また、画像をあるスペースを満たすように、つまりあるスペースに適するように画像を加工するCSSのプロパティがあります。プロパティ名は object-fit で fitを採用しています。
object-fit - CSS: カスケーディングスタイルシート | MDN

命名に fit_to_size と明示的に size を加えましたが、OGP画像の表示領域に合わせるという意味は fit だけでも伝わるのかなとも思いました。

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

かしこまりました。
fit_to_sizeが一番ピッタリきそうですね😊

勉強になりました🙇‍♂️

WIDTH = 1200
HEIGHT = 630

def fit?(width:, height:)
Copy link
Contributor

@toke04 toke04 May 1, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

こちら、just_fit?というメソッド名など、どうでしょうか?
fitだけだと、「ちょうど(1200px x 630px)」が求められている事が分からない気がしました🙇‍♂️

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

確かにjust_fitの方が1200px x 630pxが求められている事が伝わると思いました!

module Ogp
module Image
class AttachmentProcessorTest < ActiveSupport::TestCase
test '.fit_to_size' do
Copy link
Contributor

@toke04 toke04 May 1, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

こちらも、どのような

  • width
  • height

が来ても、「1200px x 630px」にリサイズされる事を確認するテストなので、
名前を変えた方が良いと思いました🙇‍♂️

  • resize_blob

はどうでしょうか?
一枚一枚の写真(画像)の事を、Active Storageでは「blob」と表現しており、
それをリサイズしているからです
スクリーンショット 2023-05-03 11 34 20

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

resizeについては、こちらのコメントに書きました〜

resize_blobはどうでしょうか?

今回の実装では、画像はモジュール名Ogp::Imageで表現しています。そのため、メソッド名の目的語に画像を含まなくても問題ないと判断しました。

Active Storageでは「blob」と表現しており

自分はこのことを知りませんでした。どちらで言及しているのか教えて頂けないでしょうか?🙏

一般的にblobbinary large objectの略で画像や音声等のバイナリデータを格納するデータ型になります。ですので、blobだと画像以外も含まれ、かつ画像や音声そのものを示さないです。
ActiveStorage::Blobのblobは、画像、ビデオファイルに関するメタデータとファイルがどこのサービス上に存在するか示すキーを含むレコードとして表現しているようです。

バイナリ・ラージ・オブジェクト
ActiveStorage::Blob

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

自分はこのことを知りませんでした。どちらで言及しているのか教えて頂けないでしょうか?🙏

すみません、自分の解釈ミスでした🙇‍♂️

wataさんのおっしゃられる通り、
blob = バイナリ・ラージ・オブジェクトであり、
一枚一枚の写真(画像)の事を「blob」とは呼びませんね、、🙇‍♂️
訂正したします🙇‍♂️

extend Ogp::Image
end

test '.fit_to_size_option' do
Copy link
Contributor

@toke04 toke04 May 1, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[没案❌]
こちら、下のresize_option メソッドで、どのような

  • width
  • height

を渡しても、規定値の

  • WIDTH = 1200
  • HEIGHT = 630

のどちらかを、返却する事を確認するテストがあるので、
このテストと上手く統合したいと思いました🙇‍♂️


[このままで良いと思った理由🟢]
↑最初、このように考えましたが、
このテストは、正常系テストなので、このままで良いと思いました。
下に、resize_optionメソッドを、同値分割法でテストを行っているので、
このままで良いと判断しました

assert_equal expected.to_a, Dummy.fit_to_size_option(width: 500, height: 500).to_a
end

test '.fit?' do
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

こちらも、https://github.com/fjordllc/bootcamp/pull/6483/files#r1181512908で指摘した通り、
just_fit?という名前が良いと思いました🙇‍♂️

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ご指摘ありがとうございます!こちらも同様にjust_fit?の方が意味が明確に伝わると思いました!

@@ -41,6 +43,8 @@ def create
def update
set_wip
if @article.update(article_params)
Ogp::Image::AttachmentProcessor.fit_to_size(@article.thumbnail) if @article.thumbnail.attached?
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

上のメソッド名を変えると、こちらも変更になる感じですかね🙇‍♂️

assert_not Dummy.fit?(width: 1200, height: 631)
end

test '.resize_option return 1200x when width magnification is grater than height magnification' do
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

下のテストも合わせ、
パターンは問題なく網羅されていると思いました🙇‍♂️

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

細かく確認して頂きありがとうございます!

@toke04
Copy link
Contributor

toke04 commented May 3, 2023

@wata00913
お疲れ様です。
レビュー致しました😊

レビューをする過程でたくさん勉強になりました🙇‍♂️
何か疑問点等ございましたら、お申し付けください🙇‍♂️

@wata00913
Copy link
Contributor Author

wata00913 commented May 20, 2023

@syo-tokeshi
お疲れさまです!
早めにレビューして頂きありがとうございます😀
また、レビューへの返信遅れてすみませんでした🙇‍♂️

レビュー指摘箇所に対してコメントしました。命名についてのコメントで何かご指摘があればよろしくお願いします。
指摘箇所の修正は未着手の状態です。

暫くの間、コメントへの返信が遅れるかもしれないです。申し訳ありません。🙇‍♂️

@toke04
Copy link
Contributor

toke04 commented May 21, 2023

@wata00913
お疲れ様です。
返信致しました🙇‍♂️
fit? just_fit?に変えた方が良いかなー、と思う所以外は、
全て良いと思います。

レビューをする中で、圧倒的にwataさんの方が考えたのだろうな、というのが分かり、
本当に勉強になりました🙇‍♂️
ありがとうございます🙇‍♂️

こうやってレビュアーと会話する中で、命名一つ取っても、
ちゃんと考えて実装されているかが分かりました😊

暫くの間、コメントへの返信が遅れるかもしれないです。申し訳ありません。🙇‍♂️

かしこまりました!
全然大丈夫ですよ〜😆

@wata00913 wata00913 force-pushed the feature/fit-to-size-for-ogp-thumbnails branch from 2996f22 to 81dc2a5 Compare June 19, 2023 23:25
@wata00913
Copy link
Contributor Author

@syo-tokeshi
お疲れ様です!
長らくレビューの対応が出来ずすみませんでした🙇‍♂️

ご指摘頂いた箇所を修正しましたので、確認をよろしくお願いします🙏

@@ -5,7 +5,7 @@ module Image
WIDTH = 1200
HEIGHT = 630

def fit?(width:, height:)
def just_fit_to_size?(width:, height:)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

変更ありがとうございます😊
4つの単語で構成されていますが、一つ一つの単語が短いこともあり、これで良さそうですね😆
意味が明確になって良くなったと思います😊


article.thumbnail.blob.analyze unless article.thumbnail.blob.analyzed?
assert_equal({ width: 1200, height: 630 },
assert_equal({ width: WIDTH, height: HEIGHT },
Copy link
Contributor

@toke04 toke04 Jun 20, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

こちら悩みますね、、
読んでスッキリ意味が分かるのは、前回のこちらの気がします、、
assert_equal({ width: 1200, height: 630 }

前回の方が良い気がしてます、、🙇‍♂️

テストが行われているこのファイル自体に

  • WIDTH
  • HEIGHT

の値があるなら、問題ないと思うのですが、app/models/ogp/image.rbで定義されていて、ジャンプしないと見れないのが気になりました、、🙇‍♂️

また、

{ width: WIDTH, height: HEIGHT }

上記はデータ型としてハッシュですが、
キーとバリューが同じ文言になっているのもちょっと引っかかってしまいます、、(他でもそういうのを見かけますが、今回のケースだと何故か違和感を感じてしまう)

{ width: 1200, height: 630 }

こっちの方が、違和感がない気がします

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

問題ないと思うのですが、app/models/ogp/image.rbで定義されていて、ジャンプしないと見れないのが気になりました、、🙇‍♂️

確かに、テストコード内で定義したものか、モジュールで定義したものか判断しづらいですね!
別のテストコードでもハードコーディングしてるので、元に戻そうと思います〜

@toke04
Copy link
Contributor

toke04 commented Jun 20, 2023

コメント致しました🙇‍♂️
今回議論したいのはこちらになります🙇‍♂️
#6483 (comment)

今回のケースでは、可読性を考慮して前回のコード(assert_equal({ width: 1200, height: 630 })で良い気がしました🙇‍♂️

ベタ書きを採用しても良いような気がします。

@wata00913
Copy link
Contributor Author

@syo-tokeshi
ご指摘頂いた箇所を修正しましたので、再度確認をよろしくお願いします🙏

@toke04
Copy link
Contributor

toke04 commented Jun 20, 2023

@wata00913
確認いたしました!!🙇‍♂️
全て確認の上goodと思ったので、approveします😄

@wata00913
Copy link
Contributor Author

wata00913 commented Jun 20, 2023

@syo-tokeshi
確認ありがとうございました!

@komagata
チームメンバーからApproveを頂いたので、レビューをよろしくお願いします🙇‍♂️

@wata00913 wata00913 requested a review from komagata June 20, 2023 04:42
# frozen_string_literal: true

module Ogp
module Image
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

もう一つのmoduleもですが、基本的にはclassで設計すべきです。
moduleは他のクラスにmix-inするために使うのがメインです。

Copy link
Contributor Author

@wata00913 wata00913 Jul 5, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

モジュールからクラスに修正しました!
具体的に以下の対応をしました。14ce3351e32d78で修正しました。

  • Ogp::Image::AttachmentProcessorの名前空間が長いためOgp::ImageProcessorに変更
  • Ogp::ImageProcessorをモジュールからクラスに変更
  • Ogp::Imageが余分にモジュール化してると感じたので、Ogp::ImageのメソッドをOgp::ImageProcessorに委譲

@@ -41,6 +43,8 @@ def create
def update
set_wip
if @article.update(article_params)
Ogp::Image::AttachmentProcessor.fit_to_size(@article.thumbnail) if @article.thumbnail.attached?
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

saveの時と全く同じならば共通化した方がミスが少なくなると思います。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

こちら971829fで修正しました!
今回の修正で実際にミスが発生してしまったので痛感しました😅

@wata00913 wata00913 force-pushed the feature/fit-to-size-for-ogp-thumbnails branch from d5ec602 to 971829f Compare July 5, 2023 00:33
@wata00913
Copy link
Contributor Author

@komagata
レビューでご指摘頂いた箇所を修正しましたので、確認をよろしくお願いします🙇‍♂️

@@ -0,0 +1,54 @@
# frozen_string_literal: true

module Ogp
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

全てクラスメソッドになっているので、まずクラスをインスタンス変数とインスタンスメソッドで設計してみてください。

全てクラスメソッドなので外部から不要なメソッドも呼び出せるようになっています。

クラス名が表すものとそれが持つ変数(名詞)、それが持つメソッド(動詞)をやりたいことの文章から設計してみるといいかもです。

また、Ogp::ImageProcessorですと、他のOgp画像も同じ縦横で処理するという意味合いになると思うのですが、その辺りも検討したほうがいいかもです。(practiceのogp imageやpageのogp imageなど)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ogp::ImageProcessorですと、他のOgp画像も同じ縦横で処理するという意味合いになると思うのですが、その辺りも検討したほうがいいかもです。

こちらのコメントにて、他のOgp画像にも同じ処理を使うとのことなので、意図的に Ogp::ImageProcessorにしました。

Copy link
Contributor Author

@wata00913 wata00913 Jul 19, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

クラスの設計を再検討し、3つの案を考えました。

懸念点を踏まえると「案2」を採用しようと考えてますが、ご指摘でデータ構造や処理自体を大幅に変更する可能性があるため、実装前にクラス設計のレビューをお願いします🙇‍♂️

クラス図の補足説明

  • - privateメソッド
  • + publicメソッド

案1

1つのクラスで再構成しました。 new 以外のメソッドはインスタンスメソッドになります。

  • 懸念点
    • fit_to_size_option をテストしたいが、privateメソッドのテストが必要。
      • fit_to_size_optionの呼び出し元fit_to_size は、加工した画像のサイズ(1200px x 630px)のテストは可能だが、適切なオプションで画像加工がされたか判断することが出来ない。
classDiagram
class `Ogp::ImageProcessor`{
  WIDTH
  HEIGHT
  attached_one
  + new(attached_one)
  + fit_to_size()
  - just_fit_to_size?()
  - fit_to_size_option()
  - resize_option(width, height)
  - clip_option()
}
Loading

案2

案1でprivateメソッドのテストがあるため、クラスの分割をしました。

  • Ogp::TransformOption
    • OGP画像に加工するオプションを作成するクラス
classDiagram
`Ogp::ImageProcessor` *-- `Ogp::TransformOption`
class `Ogp::TransformOption` {
  width
  heigth
  + new(width, height)
  + fit_to_size_option(original_width, original_height)
  + just_fit_to_size?(original_width, original_height)
  - resize_option(original_width, original_width)
  - clip_option()
}
class `Ogp::ImageProcessor`{
  attached_one
  transform_option
  WIDTH
  HEIGHT
  + new(attached_one)
  + fit_to_size()
  + just_fit_to_size?()
}
Loading

案3

OGP画像の加工に必要なオプション作成のみをクラスにします。

以下の処理はOgp::ImageProcessorではなく、コントローラーで実行します。

  • 10行目〜13行目にある元画像の(幅, 高さ)の取得

  • 19行目〜23行目にある画像加工(元の画像の削除も含む)処理は、コントローラーで行います。

  • 懸念点

    • 他ページ(practiceやpage)のOGP画像にも今回の加工処理を適用する予定のため、コントローラーに書く処理が重複してしまう。
    • initialize の引数にOGP画像のサイズ(1200, 630)を渡す必要があり、(1200, 630)を渡す処理も重複する
      • また、(1200, 630)を定数としてクラス内で定義した場合、メソッド群をわざわざインスタンスメソッドにする必要性が無くなる。
classDiagram
class `Ogp::TransformOption` {
  width
  heigth
  + new(width, height)
  + fit_to_size_option(original_width, original_height)
  + just_fit_to_size?(original_width, original_height)
  - resize_option(original_width, original_width)
  - clip_option()
}
Loading

@komagata
Copy link
Member

komagata commented Mar 1, 2024

@wata00913 返信を忘れており、大変申し訳ありません。
申し訳ないですが上記conflictの修正をお願いできればありがたいです。

@wata00913
Copy link
Contributor Author

@komagata
レビュー対応が遅れてしまいすみません。

申し訳ないですが上記conflictの修正をお願いできればありがたいです。

こちら、了解しました。以下コメントで定数の指針が決まり次第、再実装と同時にconflict修正をしようと思います。
お手数ですが、以下コメントの確認をお願いします🙇‍♂️

前回駒形さんから頂いたレビュー指摘#6483 (comment) にて、OGPサイズの定義箇所を以下のように考えましたが、いかがでしょうか?

  • パス:config/initializers/constants.rb
  • 定数名:Constants::OGP_SIZE

理由としては、#6415 (comment) にて、他ページでもOGP画像のリサイズのサイズで利用されるので、Railsのinitializerで定義するのが適切するかと考えました。

@kyokucho1989
Copy link
Contributor

@komagata @wata00913
横からすみません!!

現在以下のIssueが進行してます。
#7330

画像変換のライブラリが変更となるので、このIssueに影響があるのではとコメントしました。

私も下記Issueを担当しますが、本Issueで画像切り取りのコードが共通化されそうなので、これを待って実装しようかと思っています。
#7383

実装の順序、方針などを示しただけると助かります!
以上です!

@komagata
Copy link
Member

komagata commented Mar 6, 2024

@kyokucho1989

画像変換のライブラリが変更となるので、このIssueに影響があるのではとコメントしました。

はい、影響ありますね。
申し訳ないです > @wata00913

私も下記Issueを担当しますが、本Issueで画像切り取りのコードが共通化されそうなので、これを待って実装しようかと思っています。

それで良いと思います。

@kyokucho1989 @wata00913 もしかしたら下記で話している内容(複数種類の変換を一度に書ける)で簡単になる部分があるかもなので結果をお待ちいただければと思います。

#7397

@komagata
Copy link
Member

komagata commented Mar 6, 2024

@wata00913 こちらで @yocchan-git さんがおっしゃってるやり方でいけますでしょうか。

#7397 (comment)

@yocchan-git
Copy link
Contributor

yocchan-git commented Mar 20, 2024

@wata00913 さん

こちら切り抜きについて、僕の方でクラスを作成して共通化させていただきます!
今日中にPRを送って〜になりますので、今しばらくお待ちいただけますと🙏

経緯はこちら

@yocchan-git
Copy link
Contributor

yocchan-git commented Mar 24, 2024

@wata00913 さん
cc: @kyokucho1989 さん

wataさん、お疲れ様です。画像リサイズの処理を共通化しましたのでご確認いただきたく🙏
現状、このような形でクラスに抽出し共通化しました

処理の流れとしましては、この部分でインスタンス化して使用します。詳しく解説します

処理の流れ

インスタンスを生成する際、
対象のオブジェクトと切り取りたい「幅・高さ」、あとはオプションがあれば指定するようにします。

そして、resizeメソッドを呼び出すと、現状の縦横比を見て、短い辺を基準に拡大or縮小します。(値を返す部分・実際に拡大・縮小して切り取る部分)

要約

完全に理解する必要はないのですが、要するにImageResizerクラスを使うと

  1. 短い辺を基準に拡大(or縮小)
  2. そして、切り取る

という処理ができます。こう言った処理でよろしかったでしょうか?🤔
wataさん、ご確認して返信いただけますと嬉しいです!

また、kyokuchoさんも後ほど実装すると思いますのでccさせていただきました!
失礼しました🙇‍♂️

@kyokucho1989
Copy link
Contributor

@yocchan-git
ありがとうございます!
今取り組んでいるIssueが終わったら、やってみようと思います!

@wata00913
Copy link
Contributor Author

wata00913 commented Mar 25, 2024

@yocchan-git cc: @kyokucho1989

お疲れ様です!共通化ありがとうございます🙇‍♂️

コメント拝見しました。大まかな処理はあってそうでした。
気になる点が2つありましたので、質問させてください。


1つ目の質問です。

短い辺を基準に拡大(or縮小)

ここの基準選定がyocchanさん担当Issueと僕のIssue #6415 で違ってるかもしれませんが、いかがでしょうか?
#6415の場合、現状の縦横比だけでなく、リサイズ後の縦横比も見る必要があります。

しかし、実装して頂いたロジックで僕のIssueの要件も満たせるかもしれませんので、動作確認してみます

リサイズの詳細は、下記リンクを参考していただけると助かります🙇‍♂️


2つ目の質問です。

そして、切り取る

この切り取りは、「画像の真ん中を切り取る」という認識であってますでしょうか?

@yocchan-git
Copy link
Contributor

@wata00913 さん、質問いただきありがとうございます!

基準選定がyocchanさん担当Issueと僕のIssue #6415 で違ってるかもしれませんが、いかがでしょうか?

見ました。ありがとうございます!🙏
このコメントを参考に回答すると、細かい箇所は違ってそうです

おっしゃる通り。「変形前のアスペクト比を維持した状態で拡大する。」という点で違いますね🤔
ただ、個人的には画像切り抜き処理は共通化したいところです。

共通化できないか、確認してみます!💪

「画像の真ん中を切り取る」という認識であってますでしょうか?

おっしゃる通り、真ん中を切り取ります😁

@yocchan-git
Copy link
Contributor

@komagata さん
@machida さん

画像切り取りの仕様について相談お願いいたします🙏

現状、僕がユーザー画像切り取りのissueを進めており、
wataさんはブログサムネイル切り取りをしています。

せっかくなので、クラスに抽出し共通化しようと思ったのですが仕様の細部が違うようです(参考です)
この場合、仕様を統一しますでしょうか?するとすればどのようにしますでしょうか?🤔

  1. 統一しない
  2. wataさんのissueに統一
  3. 僕のissueに統一

お手隙でご回答よろしくお願いいたします🙇‍♂️

@machida
Copy link
Member

machida commented Mar 25, 2024

@yocchan-git @wata00913
仕様は統一したいと思いますー!
wataさんのでお願いしたいですが、
すいません、その前に確認のため、yocchanさんの仕様とwataさんの仕様の異なっている部分を説明していただいてもらっていいでしょうか🙏
だいぶ経つので何か僕も誤解があるかも知れず...

@yocchan-git
Copy link
Contributor

@wata00913 さん
cc: @machida さん

machidaさん、ありがとうございます!説明します🙇‍♂️

  • ユーザーアイコン(僕)→短い辺を基準に拡大する
  • サムネイル(wataさん)→アスペクト比を維持して拡大する

ですので、正方形の時などに仕様が違います。(こちらのコメントの一節をから例)

• 例えば、(w, h) = (500, 500)の場合、(w’, h’) = (1200, 1200)。

僕の実装したコードでは、(w, h) = (500, 500)の時、いきなり(w’, h’) = (1200, 630)というのが主な違いになります🫡

その上で、wataさんに質問なのですが、

w ≥ 1200、h < 630の場合
h’ = 630にし、w’は変形前のアスペクト比を維持して拡大。
w < 1200、h ≥ 630の場合
w’ = 1200にし、h’は変形前のアスペクト比を維持して拡大。

という場合の詳細条件を教えていただけますでしょうか?
具体的にはwとhの関係についてです、w>h,h>wで仕様も変わってくると思うのですが書かれていなかったので!

machidaさんでも構いませんので、お手隙でご回答いただけますと嬉しいです🙏

@machida
Copy link
Member

machida commented Mar 25, 2024

@yocchan-git (cc @wata00913)

ごめんなさい🙇
yocchanさんへの仕様の伝え方が悪かったです。

アイコンもアスペクト比を維持するようにしていただきたいです。
というのも、例えば自分の顔をアイコン画像にした場合、その画像が正方形でなかったら、横に伸びたり、縦に伸びたりして、変な顔になってしまうからです。自分の顔が変な顔に加工されたことに不快を感じ、それをアイコンとして使いたくなくなってしまうことを避けるために、アスペクト比を維持するようにしたいです🙏

画像加工のイメージを作成しました。
このようにしていただきたいです。
もし、以下で用意したケース以外で必要なサイズのケースがありましたら作成しますので、
必要なものがありましたら言ってください🙏

<アイコン画像トリミングのイメージ>
https://codepen.io/machida/pen/wvZeyeg
https://codepen.io/machida/pen/qBwjxYz

<サムネイル画像トリミングのイメージ>
https://codepen.io/machida/pen/yLrXvqE
https://codepen.io/machida/pen/BaEZYMZ

@yocchan-git
Copy link
Contributor

@wata00913 さん
cc @machida さん

仕様を満たすオプションが見つかりましたので、こちらで構わないか確認いただきたいです。🙇‍♂️
結論、resize_to_fillオプションになります(参考)

こちらについて説明すると、ざっくりというなら

  1. アスペクト比を維持して拡大(or縮小)する
  2. 大きくなった場合は真ん中で切り取る

という実装になると思います。🙏
こちらで仕様と満たしていると思うし、これで共通化しなくてもシンプルになっていいと思います

ご確認いただけますと嬉しいです🙇‍♂️

@wata00913
Copy link
Contributor Author

wata00913 commented Mar 26, 2024

@yocchan-git cc: @machida

仕様を満たすオプションが見つかりましたので、こちらで構わないか確認いただきたいです。🙇‍♂️
結論、resize_to_fillオプションになります[(参考)

ご提示頂いたvariantメソッドのresize_to_fillを使う方針で良いと思います!
resize_to_fillの実装確認と実際に画像加工しましたが、期待通りの結果になってたので問題なさそうです。🙆‍♂️

@yocchan-git
Copy link
Contributor

yocchan-git commented Mar 26, 2024

@wata00913 さん
cc @kyokucho1989 さん

それでは、共通化するまでもなさそうですので
それぞれで実装できればと思います!👍

長いことお話しありがとうございました
もし何かありましたらぜひ教えていただけますと嬉しいです🙇‍♂️

kyokuchoさん、上記コメントとのことです!よろしくお願いいたします

@kyokucho1989
Copy link
Contributor

@yocchan-git
ありがとうございます!
まとめると、

  • アイコン画像もサムネイル画像もリサイズさせる仕様は同じ
  • 共通化はしない

ということですね。

私が取り組む予定のIssue (#7383)は、
@wata00913 さんの実装が終了次第、そのメソッドを利用する。

ということで、よいでしょうか?

@yocchan-git
Copy link
Contributor

@kyokucho1989 さん

komagataさんのレビューによりますが、こんな感じで実装できるかなと思います
ですので、待たなくても良さそうです!

よろしくお願いします🙇

@kyokucho1989 kyokucho1989 changed the base branch from main to border-fic April 3, 2024 09:55
@kyokucho1989
Copy link
Contributor

すみません、ベースブランチを誤って変更してしまいました。

もとに戻せないか確認します

@kyokucho1989 kyokucho1989 changed the base branch from border-fic to main April 3, 2024 22:11
@kyokucho1989
Copy link
Contributor

戻せました。お騒がせしました。

@wata00913
おはようございます。本件の進捗いかがでしょうか。私はあと一週間ほどで関連するIssueに着手できそうなので、それまでに方向性を再度確認したいです。

@wata00913
Copy link
Contributor Author

wata00913 commented Apr 4, 2024

@kyokucho1989

お疲れ様です。返信が遅れてしまいすみません🙇

kyokuchoさんのと私の処理を共通化するかどうかですよね。
システム側でリサイズした画像を、再加工する、別画面でも表示するケースがある場合、共通化したほうが良いと思ってます。
逆を言えば、システム側でリサイズ前の元画像を利用する場合、共通化の必要は無さそうです。

@machida
OGP画像の加工について質問があります。🙇‍♂️

システム側でリサイズする前の画像は残しておいた方が良いでしょうか?
リサイズ前の画像に対して1200px x 630px以外の画像加工をするかどうか気になりました。

@machida
Copy link
Member

machida commented Apr 4, 2024

@wata00913 OGPでしか使うことはないので、加工前の画像は保存しなくて大丈夫ですー

@kyokucho1989
Copy link
Contributor

@wata00913 @machida
ありがとうございますー
共通化しない方向で進めていきます

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants