ウェブサイトに画像を表示すると、興味深い問題が生じます。一方では、画像を一般に公開したい一方で、不当な使用から保護したいという問題です。これを実現する古くからの方法は、透かしを入れることです。
あ デジタル透かし は、音声、ビデオ、または画像データなどのノイズ耐性のある信号にひそかに埋め込まれたマーカーの一種です。通常、このような信号の著作権の所有者を識別するために使用されます。「ウォーターマーク」は、搬送信号にデジタル情報を隠すプロセスです。隠された情報には、搬送信号との関連が含まれている必要がありますが、必ずしも含まれている必要はありません。デジタル ウォーターマークは、搬送信号の信頼性や整合性を検証したり、所有者の身元を表示したりするために使用できます。著作権侵害の追跡や紙幣の認証によく使用されます。
— デジタル透かし
透かしを表示することで、画像を盗もうとする人に対する抑止力として機能します。また、盗まれた後にその出所を証明するために使用することもできます。
しかし、サイトに画像が多すぎると、事前に透かしを入れるのは面倒です。動的に透かしを入れる方がはるかに簡単です。既存の透かし専用のJVMライブラリを探しましたが、意外にも何も見つかりませんでした。Java 2D APIとシンプルなJakarata EEベースのWebアプリでこれを実現できます。 Filter。
Java 2D API は 1.0 以降 JDK の一部となっており、そのことがよくわかります。
これは次のコードに変換されます。
private fun watermark(imageFilename: String): BufferedImage? {
val watermark = ImageIO.read(ClassPathResource("/static/$imageFilename").inputStream) ?: return null //1
val watermarker = ImageIO.read(ClassPathResource("/static/apache-apisix.png").inputStream) //2
watermark.createGraphics().apply { //3
drawImage(watermarker, 20, 20, 300, 300, null) //4
dispose() //5
}
return watermark
}
- オリジナル画像を入手
- 透かし画像を取得する
- 元の画像のキャンバスを取得する
- 透かしを描きます。部分的に透明にするのは面倒だったので
- このオブジェクトに関連付けられたシステムリソースを解放します
他のスタックには、RustやWebAssembly用のphoton-rsなどの専用ライブラリがある場合があります。これがあれば、Webパーツに移行できます。前述のように、 Filter。
class WatermarkFilter : Filter {
override fun doFilter(request: ServletRequest, response: ServletResponse, chain: FilterChain) {
val req = request as HttpServletRequest
val imageFilename = req.servletPath.split("/").last() //1
val watermarked = watermark(imageFilename) //2
response.outputStream.use {
ImageIO.write(watermarked, "jpeg", it) //3
}
}
}
- 画像ファイル名を取得する
- 画像に透かしを入れる
- レスポンス出力ストリームに画像を書き込む
この投稿では、Java スタック上の画像に透かしを入れる方法を説明しました。既存のライブラリが見つからなかったため、透かしは手動で入れました。
来週は、インフラストラクチャ コンポーネントに基づいたノーコード アプローチを紹介します。
さらに進むには:
2024年6月30日にA Java Geekで最初に公開されました
