在 Java 虛擬機上實施動態浮水印保護 Master Dynamic Watermarking on the Java Virtual Machine

https://hackernoon.com/master-dynamic-watermarking-on-the-java-virtual-machine

在 Java 虛擬機器上應用動態浮水印

在網站上顯示圖像存在一個有趣的問題:一方面,你希望讓它們公開可用;另一方面,你想要保護它們免受不當使用。實現這一目標的古老方法是加上浮水印:

\
數位浮水印是一種潛藏於容忍噪音信號(如音頻、視頻或圖像數據)中的標記。它通常用於識別這些信號的版權所有權。”浮水印”是將數位信息隱藏在載體信號中的過程;隱藏的信息應該,但並不需要,與載體信號有關。數位浮水印可用於驗證載體信號的真實性或完整性,或展示其擁有者的身份。它主要用於追蹤版權侵權和鈔票驗證。

\
浮水印可以是可見的,以防止人們盜用圖像;或者,它可以用於在圖像被盜後證明其來源。

\
然而,如果一個網站上有太多圖像,事先給它們加上浮水印可能會成為負擔。動態給圖像加上浮水印可能會更加簡單。我嘗試尋找一個專門用於在 JVM 上加浮水印的現有庫,但出乎意料地什麼都沒有。我們可以在基於 Jakarata EE 的 Web 應用程序中使用 Java 2D API 和一個簡單的過濾器來實現。

\
Java 2D API 自 JDK 1.0 版本開始就已經存在且表現出色。

\

它可以轉換為以下代碼:

\
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。有了這些,我們可以轉向網頁部分。如上所述,我們需要一個過濾器。

\
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 技術堆棧上給圖像加上浮水印。我之所以手動添加浮水印,是因為找不到任何現有庫。

\
下週,我將展示基於基礕結構組件的無代碼方法。

\n
進一步了解:

數位浮水印

Java 2D API

WebAssembly 中的圖像處理

本文最初在 2024 年 6 月 30 日刊登於「A Java Geek」網站。

via HackerNoon

July 6, 2024 at 12:57AM

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *