Įvaldykite dinaminį vandenženklį „Java“ virtualioje mašinoje

Vaizdų rodymas svetainėje yra įdomi problema: viena vertus, norite padaryti juos viešai prieinamus; kita vertus, norite apsaugoti juos nuo netinkamo naudojimo. Amžinas būdas tai pasiekti yra vandenženklis:
A skaitmeninis vandens ženklas yra tam tikras žymeklis, slaptai įterptas į triukšmui atsparų signalą, pvz., garso, vaizdo ar vaizdo duomenis. Paprastai jis naudojamas tokio signalo autorių teisių nuosavybei nustatyti. „Vandenženklinimas“ – skaitmeninės informacijos slėpimo nešiklio signale procesas; paslėpta informacija turi turėti ryšį su nešiklio signalu, bet nebūtina. Skaitmeniniai vandens ženklai gali būti naudojami nešiklio signalo autentiškumui ar vientisumui patikrinti arba jo savininkų tapatybei parodyti. Jis plačiai naudojamas autorių teisių pažeidimams atsekti ir banknotų autentifikavimui nustatyti.
— Skaitmeninis vandenženklis
Vandens ženklas gali būti matomas, kad atgrasytų žmones pavogti vaizdą; Arba galite jį naudoti norėdami įrodyti jo kilmę po to, kai jis buvo pavogtas.
Tačiau jei svetainėje yra per daug vaizdų, gali būti sunku juos iš anksto pažymėti vandens ženklu. Gali būti daug paprasčiau juos dinamiškai pažymėti vandens ženklu. Ieškojau esamos JVM bibliotekos, skirtos vandenženkliams, bet stebėtinai nieko neradau. Tai galime pasiekti naudodami Jakarata EE pagrįstą žiniatinklio programą su Java 2D API ir paprasta Filter
.
„Java 2D“ API yra JDK dalis nuo 1.0 ir tai rodo.
Jis paverčiamas tokiu kodu:
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
}
- Gaukite originalų vaizdą
- Gaukite vandenženklio vaizdą
- Gaukite originalaus vaizdo drobę
- Nubrėžkite vandens ženklą. Aš buvau per tingus, kad jis būtų iš dalies skaidrus
- Atleiskite sistemos išteklius, susietus su šiuo objektu
Kituose rinkiniuose gali būti tam skirtų bibliotekų, pvz., „Rust“ ir „WebAssembly“ skirtų fotonų. Kai tai yra, galime pereiti prie žiniatinklio dalies. Kaip minėta aukščiau, mums reikia a 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
}
}
}
- Gaukite vaizdo failo pavadinimą
- Vaizdo vandenženklis
- Įrašykite vaizdą atsakymo išvesties sraute
Šiame įraše paaiškinau, kaip pažymėti vaizdus vandens ženklu „Java“ krūvoje. Vandenženklį dariau rankiniu būdu, nes neradau jokios bibliotekos.
Kitą savaitę parodysiu be kodo metodą, pagrįstą infrastruktūros komponentais.
Norėdami eiti toliau:
Iš pradžių paskelbta „A Java Geek“ 2024 m. birželio 30 d