Java 仮想マシンでの動的ウォーターマークのマスター

in Vlog

ウェブサイトに画像を表示すると、興味深い問題が生じます。一方では、画像を一般に公開したい一方で、不当な使用から保護したいという問題です。これを実現する古くからの方法は、透かしを入れることです。

デジタル透かし は、音声、ビデオ、または画像データなどのノイズ耐性のある信号にひそかに埋め込まれたマーカーの一種です。通常、このような信号の著作権の所有者を識別するために使用されます。「ウォーターマーク」は、搬送信号にデジタル情報を隠すプロセスです。隠された情報には、搬送信号との関連が含まれている必要がありますが、必ずしも含まれている必要はありません。デジタル ウォーターマークは、搬送信号の信頼性や整合性を検証したり、所有者の身元を表示したりするために使用できます。著作権侵害の追跡や紙幣の認証によく使用されます。

— デジタル透かし

透かしを表示することで、画像を盗もうとする人に対する抑止力として機能します。また、盗まれた後にその出所を証明するために使用することもできます。

しかし、サイトに画像が多すぎると、事前に透かしを入れるのは面倒です。動的に透かしを入れる方がはるかに簡単です。既存の透かし専用の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
}
  1. オリジナル画像を入手
  2. 透かし画像を取得する
  3. 元の画像のキャンバスを取得する
  4. 透かしを描きます。部分的に透明にするのは面倒だったので
  5. このオブジェクトに関連付けられたシステムリソースを解放します

他のスタックには、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
        }
    }
}
  1. 画像ファイル名を取得する
  2. 画像に透かしを入れる
  3. レスポンス出力ストリームに画像を書き込む

この投稿では、Java スタック上の画像に透かしを入れる方法を説明しました。既存のライブラリが見つからなかったため、透かしは手動で入れました。

来週は、インフラストラクチャ コンポーネントに基づいたノーコード アプローチを紹介します。

さらに進むには:


2024年6月30日にA Java Geekで最初に公開されました

関連記事

前の投稿
ビッグテックのAI巨人たちの衝突において知識が力となる理由
次の投稿
法廷筆写における人間の手がかけがえのないものである理由(少なくともAIが責任を問われるまでは)