要一個完整的例子,傳入的參數最好是
源文件 byte[] 文字內容
返回的是加水印之後的 byte[]
最好有注釋,謝謝了
Exception in thread "main" sun.misc.ServiceConfigurationError: javax.imageio.spi.ImageReaderSpi: Provider it.geosolutions.imageio.stream.input.spi.FileImageInputStreamExtImplSpi not a subtype at sun.misc.Service.fail(Service.java:129) at sun.misc.Service.access$000(Service.java:111) at sun.misc.Service$LazyIterator.next(Service.java:278) at javax.imageio.spi.IIORegistry.registerApplicationClasspathSpis(IIORegistry.java:190) at javax.imageio.spi.IIORegistry.(IIORegistry.java:121) at javax.imageio.spi.IIORegistry.getDefaultInstance(IIORegistry.java:142) at javax.imageio.ImageIO.(ImageIO.java:48) at com.xiaoliu.mobile.WaterMarker.changeImg2Byte(WaterMarker.java:64) at com.xiaoliu.mobile.WaterMarker.main(WaterMarker.java:36)
以下是根據byte[]對象來進行文字水印的添加,主要涉及的就是圖像對象如何與byte[]數組轉換的問題,還是使用圖像畫筆進行的水印添加,水印文字添加在圖像的正中央。
可根據需要修改水印字體樣式和透明度。代碼如下:
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.imageio.ImageIO;
/**
* 文字水印
* 參考 http://sjsky.iteye.com/blog/1154390
* 參考
*/
public class ImageMarkLogoByText {
/**
* @param args
*/
public static void main(String[] args) {
String srcImgPath = "d:/01.jpg";
String logoText = "[ 測試文字水印 http://ask.csdn.net]";
String targerPath = "d:/img_mark_text.jpg";
// 現在已知的是圖片路徑,所以需要自己轉換成byte數組,如果你有byte數組直接使用下面的方法
byte[] srcImgByte = changeImg2Byte(srcImgPath);
// 給圖片添加水印,需要傳入文字和圖片的byte數組,返回結果是加了水印的圖片byte[]對象
byte[] resultByte = ImageMarkLogoByText
.markByText(logoText, srcImgByte);
// 為了便於查看,下面對結果進行了輸出
BufferedImage resultImage = changeByte2Img(resultByte);
try {
ImageIO.write(resultImage, "JPG", new FileOutputStream(targerPath));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 根據傳入的圖像文件路徑讀取圖像,並存入到byte數組中。
*
* @param srcImgPath
* @return
*/
private static byte[] changeImg2Byte(String srcImgPath) {
// TODO Auto-generated method stub
try {
BufferedImage image = ImageIO.read(new File(srcImgPath));
ByteArrayOutputStream out = new ByteArrayOutputStream();
ImageIO.write(image, "jpg", out);
byte[] b = out.toByteArray();
return b;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
/**
* 給圖片添加文字水印
*
* @param logoText
* @param srcByteImg
*/
public static byte[] markByText(String logoText, byte[] srcByteImg) {
InputStream is = null;
ByteArrayOutputStream os = null;
try {
// 獲取image對象,沒有他做不了繪制
BufferedImage buffImg = changeByte2Img(srcByteImg);
// 得到畫筆對象
Graphics2D g = buffImg.createGraphics();
// 設置對線段的鋸齒狀邊緣處理
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
int width = buffImg.getWidth(null);
int height = buffImg.getHeight(null);
g.drawImage(buffImg.getScaledInstance(width, height,
Image.SCALE_SMOOTH), 0, 0, null);
// 設置顏色
g.setColor(Color.red);
// 設置 Font
g.setFont(new Font("宋體", Font.BOLD, 30));
FontMetrics fontMetrics = g.getFontMetrics();
int logoWidth = fontMetrics.stringWidth(logoText);
// 設置水印的透明度
float alpha = 0.5f;
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
alpha));
// 第一參數->設置的內容,後面兩個參數->文字左上角在圖片上的坐標位置(x,y),簡單點設置文字在中心,豎直方向有些偏差 .
g.drawString(logoText, (width - logoWidth) / 2, height / 2
+fontMetrics.getAscent()/2 - fontMetrics.getDescent()/2);
g.dispose();
// 生成圖片
os = new ByteArrayOutputStream();
ImageIO.write(buffImg, "JPG", os);
System.out.println("圖片完成添加文字印章。。。。。。");
// 返回圖片的byte數組
return os.toByteArray();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != is)
is.close();
} catch (Exception e) {
e.printStackTrace();
}
try {
if (null != os)
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
/**
* 根據傳入的圖像byte數組轉換成圖像
*
* @param srcByteImg
* @return
*/
private static BufferedImage changeByte2Img(byte[] srcByteImg) {
// TODO Auto-generated method stub
ByteArrayInputStream in = new ByteArrayInputStream(srcByteImg);
try {
BufferedImage image = ImageIO.read(in);
return image;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
原始圖像:
結果圖像: