水印生成图片(2)
package text;
/**
* @author 让痛苦痛苦
* @param 说明:ImageLabeler类用来实现水印效果,这个类的部分代码和方法ImageDisplay applet想同。通过调用
* 组件的get/setProperty指令,很多变量名都可以与applet完全相同,这样一来,这个类不但可以用于Imageloader
* 其他调用过程或JavaBean也可以实现对水印效果的控制。和applet加载图片文件的方法一样,ImageLabeler也使用了
* MediaTracker类
* 出来设置参数,通常还要用到如下两个成员函数:
* --publicvoidWatermarkImage(String inImgFilename,String outImageFilename),这个函数可以独立使用,
* inImgFilename指定要加载的图片文件,outImageFilename是修改后的图片保存时所用的文件名。
* --public SevletOutputStream Pulling(ServletOutputStream SOSout,String imgFile),用于指定要调用的Servet
* 的名称。这个函数接受调用者提供的ServletOutputStream,参数imgFile则是被处理图片的完整路径。
*/
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.servlet.ServletOutputStream;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGDecodeParam;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
public class ImageLabeler extends JComponent {
private ServletOutputStream out;
private String strDisplayOverlay="Copyright 2008 Todd Cook";
private int iOverlayXPosition =20;
private int iOverlayYPosition =20;
private int iFontSize=14;
public String getDisplayOverlay()
{
return strDisplayOverlay;
}
public void setDisplayOverlay(String NewDisplayOverlay)
{
if(NewDisplayOverlay!=null)
{
strDisplayOverlay=NewDisplayOverlay;
}
}
public int getOverlayXPosition()
{
return iOverlayXPosition;
}
public void setOverlayXPosition(int NewOverlayXPosition)
{
iOverlayXPosition=NewOverlayXPosition;
}
public int getOverlayYPosition()
{
return iOverlayYPosition;
}
public void setOverlayYPosition(int NewOverlayYPosition)
{
iOverlayYPosition=NewOverlayYPosition;
}
public int getFontSize()
{
return iFontSize;
}
public void setFontSize(int NewFontSize)
{
iFontSize=NewFontSize;
}
public ServletOutputStream Pulling(ServletOutputStream SOSout,String imgFile)
{
out=SOSout;
BufferedImage bi=null; //LoadnModifyBufferedImage(imgFile);
try {
JPEGImageEncoder jpEnc=JPEGCodec.createJPEGEncoder(out);
jpEnc.encode(bi);
} catch (Exception e) {
e.printStackTrace();
// TODO: handle exception
}
return out;
}
public void WatermarkImage(String inImgFilename,String outImgFilename)
{
try {
FileOutputStream fos=new FileOutputStream(new File(outImgFilename));
BufferedImage bi=null; //LoadnModifyBufferedImage(inImgFilename);
JPEGEncodeParam jpEncParam=JPEGCodec.getDefaultJPEGEncodeParam(bi);
jpEncParam.setQuality(1, false);
JPEGImageEncoder jpEnc=JPEGCodec.createJPEGEncoder(fos,jpEncParam);
jpEnc.encode(bi);
fos.close();
} catch (IOException ioe) {
ioe.printStackTrace();
// TODO: handle exception
}
}
private BufferedImage LoadnModifyBufferedImage(String imgFile)
{
BufferedImage bi;
bi=new BufferedImage(1,1,BufferedImage.TYPE_INT_RGB);
try {
MediaTracker mt=new MediaTracker(this);
Image inImg=Toolkit.getDefaultToolkit().getImage(imgFile);
mt.addImage(inImg, 1);
try {
mt.waitForAll();
if(mt.isErrorAny())
{
System.out.println("Error in loading");
}
} catch (InterruptedException e) {
e.printStackTrace();
// TODO: handle exception
}
int imgWidth=inImg.getWidth(this);
int imgHeight=inImg.getHeight(this);
bi=new BufferedImage(imgWidth,imgHeight,BufferedImage.TYPE_INT_RGB);
Graphics2D g2d=bi.createGraphics();
g2d.drawImage(inImg, 0, 0, null);
Color cOverlayColor=Color.WHITE;
g2d.setFont(new Font("Arial",Font.BOLD,iFontSize));
g2d.drawString(strDisplayOverlay, iOverlayXPosition, iOverlayYPosition);
} catch (Exception e) {
e.printStackTrace();
// TODO: handle exception
}
return bi;
}
public static void main(String[] args)
{
System.out.println("Can be run stand_alone,"+"just invoke,ush get/set values,call.....");
System.out.println("例如:"+"C://11.jpeg"+"C://12.jpeg");
ImageLabeler il=new ImageLabeler();
if(args.length<2)
{
il.WatermarkImage("C://11.jpeg","C://12.jpeg");
}
else
{
il.WatermarkImage(args[0], args[1]);
}
}
/**
* @author 让痛苦痛苦
* Imagelabeler与ImageDisplay applet之间有一点细小的差别,前者将图片文件加载到BUfferedImage中。
* JPEGEncoderBufferedImage的好处体现在可以更方便地生成java2D图形对象(与BufferedImage相关联)以及
* 更方便地在其中绘图/
*/
}
/**
* @author 让痛苦痛苦
* 这是在html页面调用的代码
*
*/
//精华部分
<form action="/servlet/text.ImageLoader" method="get">
<select name="image">
<option value="biedandfish">Bird gets the fish</option>
<option value="sketchbook">Skechook</option>
</select>
<input tyoe="submit" value="submit">
</form>
< a href="htmlEmbeddedImages.html">here</a>