開發中常需為圖片添加文字水印(如版權聲明、用戶標識),且要求輸入輸出均為 byte[] 以利於網路傳輸或資料庫存儲。
ImageIO.read(new ByteArrayInputStream(srcByteImg))。buffImg.createGraphics(),設定抗鋸齒、字體、顏色、透明度。FontMetrics 取得文字寬高,置中繪製:g.drawString(logoText, (width - logoWidth)/2, height/2 + ascent/2 - descent/2);BufferedImage 寫入 ByteArrayOutputStream,再 toByteArray() 返回。public static byte[] markByText(String logoText, byte[] srcByteImg) {
try (ByteArrayOutputStream os = new ByteArrayOutputStream()) {
BufferedImage buffImg = ImageIO.read(new ByteArrayInputStream(srcByteImg));
Graphics2D g = buffImg.createGraphics();
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
int width = buffImg.getWidth(), height = buffImg.getHeight();
g.drawImage(buffImg.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);
g.setColor(Color.RED);
g.setFont(new Font("微軟正黑體", Font.BOLD, 30));
FontMetrics fm = g.getFontMetrics();
int textWidth = fm.stringWidth(logoText);
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.5f));
g.drawString(logoText, (width - textWidth)/2, height/2 + fm.getAscent()/2 - fm.getDescent()/2);
g.dispose();
ImageIO.write(buffImg, "JPG", os);
return os.toByteArray();
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
若遇到 ServiceConfigurationError: javax.imageio.spi.ImageReaderSpi,通常是類路徑衝突(如多版本 imageio 庫),請清理依賴或指定 JDK 內建實作。
