COLOPL Tech Blog

コロプラのエンジニアブログです

「チャットツールでの画像受渡し」は要注意!問題点と対処法について

こんにちは、エンジニアの 工藤 です。

Slack や社内向けチャットサービスを使っている組織であれば、画像などのリソースをチャンネルやスレッドに投稿する機会はほぼ必ずあるのではないでしょうか?

プレビュー表示もされ便利な画像投稿機能ですが、そこには 思わぬ落とし穴 があります。今回はコロプラで起きた実例と利便性を損なわない形での解決策について書かせていただければと思います。


Slack について

Slack は (当初は) 電子メールの代替を目的とした、企業内での連絡をチャット形式で行える SaaS (Software as a Service) です。多くの企業で利用されており、 Slack でなくとも類似のチャット型サービスを利用している企業は多いのではないかと思います。また、個人間では Discord などもよく利用されています。

タイトルでは「チャットツール」と書きましたが、今回取り上げる問題は Slack に限らず類似のサービス全てに共通する問題 です。

便利な画像投稿機能

Slack や類似のサービスでは、多くの場合文字以外にも画像を投稿できる機能が備わっていると思います。コロプラではデザイナー、プランナー、エンジニア間での画像の確認などで画像投稿機能が利用されています。

事件は内製の画像最適化ツール colopresso を利用した時に起きました (colopresso については こちらの記事 で詳細を解説しているので、よければお読みください。どなたでも利用できます)

blog.colopl.dev

ある日、 減色 PNG から WebP に切り替えたが、画像があまりにもノイジーで使えない という報告をデザイナーさんからいただきました。いくら圧縮率が高めでも、 256 色パレットに減色した PNG より WebP のほうが画質が劣るなんてことは流石にないはず...と思いいろいろ調査したところ、 Slack の画像投稿機能はアップロードされた画像に対し処理を行っており、そのままのデータではない ということがわかりました。

具体的には、以下の通り処理していました (2026-04-22 時点, 仕様として定められているものではないはずなので、将来的に変わる可能性もあります)。

  • PNG では メタデータ部分に変化がある が、 画像データ自体はそのまま維持されている
  • JPEG では 再圧縮がかけられ、画質が劣化している
  • WebP では JPEG よりも更に再圧縮がかけられ、画質が著しく劣化している

各種サービスにおける「画像投稿」機能について

SNS 等、最近では殆どのサービスが画像投稿機能を備えていますが、 アップロードした画像がそのままの形で保持されるサービスのほうが少ない という現実があります。これは画像データの肥大化、高解像度化によって保存容量や配信容量が増え、サーバー維持費用が嵩むこと、スマートフォンでの利用を想定しているサービスの場合、ユーザーの通信量 (所謂:ギガ) を過剰に消費することから、 全くもって合理的な設計である といえます。

しかし、 Slack はあくまで業務用途での利用が主であり、 再圧縮処理は行われないものだと勝手に思い込んでいました。 特に PNG ではそのようなことは起きていなかったので、楽観視していた部分もありました。

今回報告があったので実際に WebP 画像をアップロード -> ダウンロードし、 ImageMagick で PSNR, SSIM を計算してみると、 思っていた以上の劣化 が見られることがわかりました。

オリジナル画像 (WebP)

元のWebP画像

Slack アップロード後ダウンロードした画像 (WebP)

Slackダウンロード後

ImageMagick での SSIM, PSNR 測定結果と差分 (PNG)

ImageMagickで算出した差分データ

$ magick compare -metric PSNR original.webp slack.webp diff.png
34.7908 (0.289923)
$ magick compare -metric SSIM original.webp slack.webp diff.png
1687.63 (0.0257516)

高解像度では特に顕著で、なるほど確かに、と納得した次第でした。

コロプラでの解決策

検証した結果、現状では PNG は実データ領域に影響を受けないようですが、それでもヘッダが編集されており全く同一のファイルになっていないのは気になります。また JPEG / WebP 等は再圧縮のため、そのまま利用してしまうと問題になりかねません。

とはいえ、画像のプレビュー機能は利用したい...どうしたものか...

どうしたものかと悩んでいると、別メンバーが Google Drive にアップロードした WebP や AVIF のリンクを貼るとプレビューで展開される ことを教えてくれました!

Google Driveでのプレビュー

Google Drive はもともとがファイルストレージなので、 データが勝手に書き換わることはありません。 Google Drive と連携設定し、 Slack でリンクを貼ってもらうことで劣化問題を回避できました🎉

そもそも話: データがそのままであるという保証などどこにもない

上記でも記載した通り、 多くの場合において 投稿された画像がアップロードしたものと同一である などという保証はどこにもありません。画像・動画・音声というのは一般的にデータ量として重く、サービス提供側からしてもなるべく小さいサイズにしたいというのは当然のことです。 YouTube やニコニコ動画等もアップロードされた動画を独自の基準で再エンコードしているように、これは当然の仕様であって、 Slack が悪い、というわけではありません。

Google Drive を利用していない場合などでは、あくまで目視確認として画像で投稿し、実際に受け渡す際は zip アーカイブ等の 絶対にデータが変化しない形式 で受け渡すようにするのが重要です。基本的なことですが、便利な世界に慣れてしまうと見落としがちだな、と思った次第でした。

画像・動画・音声データの受渡しの際には十分お気をつけください!



ColoplTechについて

コロプラでは、勉強会やブログを通じてエンジニアの方々に役立つ技術や取り組みを幅広く発信していきます。
connpass および X で情報発信していますので、是非メンバー登録とフォローをよろしくお願いいたします。

また、コロプラではインフラエンジニアを積極採用中です!
興味を持っていただいた方はぜひお気軽にご連絡ください。