我在servlet 里,给一个jpg文件加上透明的gif logo(加水印),但出现了白色的锯齿。
请问如何解决?折腾了一上午。以下是代码:private void water(String imgSrc,HttpServletRequest req)
{
//Color bgColor = Color.WHITE;
String waterSrc = req.getRealPath("/images/common/wm_logo.gif");
int waterLocationX;
int waterLocationY;
ImageIcon srcFile = new ImageIcon(imgSrc);//read src image
Image srcImage = srcFile.getImage();
int srcW = srcImage.getWidth(null);
int srcH = srcImage.getHeight(null);
waterLocationX = srcW-150;
waterLocationY = srcH-60;
ImageIcon waterFile = new ImageIcon(waterSrc);//load water file
Image waterImage = waterFile.getImage();
BufferedImage tagImg = new BufferedImage(srcW,srcH, BufferedImage.TYPE_INT_RGB);
Graphics2D g = tagImg.createGraphics( );
//g.setBackground(bgColor);
g.drawImage(srcImage, 0, 0, null );
//g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,0.4f));
g.drawImage(waterImage, waterLocationX,waterLocationY, null ); //draw water image
//g.drawString(word,wordLocationX,wordLocationY); //draw string
g.dispose();
paint(tagImg,imgSrc);
}private void paint(BufferedImage tagImg,String pathImg)
{
try
{
FileOutputStream out = new FileOutputStream(pathImg);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(tagImg);
param.setQuality(50f, true);
encoder.encode(tagImg, param);
out.close();
}catch(Exception e)
{
e.getMessage();
}
}

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【7xin】截止到2008-07-03 10:47:06的历史汇总数据(不包括此帖):
    发帖的总数量:14                       发帖的总分数:700                      
    结贴的总数量:12                       结贴的总分数:680                      
    无满意结贴数:0                        无满意结贴分:0                        
    未结的帖子数:2                        未结的总分数:20                       
    结贴的百分比:85.71 %               结分的百分比:97.14 %                  
    无满意结贴率:0.00  %               无满意结分率:0.00  %                  
    楼主加油
      

  2.   

    RenderingHints hintQuality = new RenderingHints(  //呈现提示键。
    RenderingHints.KEY_RENDERING,
    RenderingHints.VALUE_RENDER_QUALITY
    );
    hintQuality.put(  //抗锯齿提示键。
    RenderingHints.KEY_ANTIALIASING,
    RenderingHints.VALUE_ANTIALIAS_ON
    );
    hintQuality.put(  //文本抗锯齿提示键。
    RenderingHints.KEY_TEXT_ANTIALIASING,
    RenderingHints.VALUE_TEXT_ANTIALIAS_ON
    );
    hintQuality.put(  //插值提示键。
    RenderingHints.KEY_INTERPOLATION,
    RenderingHints.VALUE_INTERPOLATION_BICUBIC
    );
    hintQuality.put(  //Alpha插值提示键。
    RenderingHints.KEY_ALPHA_INTERPOLATION,
    RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY
    );
    hintQuality.put(  //颜色呈现提示键。
    RenderingHints.KEY_COLOR_RENDERING,
    RenderingHints.VALUE_COLOR_RENDER_QUALITY
    );
    hintQuality.put(  //抖动提示键。
    RenderingHints.KEY_DITHERING,
    RenderingHints.VALUE_DITHER_ENABLE
    );
    hintQuality.put(  //字体规格提示键。
    RenderingHints.KEY_FRACTIONALMETRICS,
    RenderingHints.VALUE_FRACTIONALMETRICS_ON
    );
    hintQuality.put(  //笔划规范化控制提示键。
    RenderingHints.KEY_STROKE_CONTROL,
    RenderingHints.VALUE_STROKE_PURE
    );
    Graphics2D g2d = (Graphics2D) g;
    g2d.setRenderingHints(hintQuality);
    g2d./*你的绘图方法*/;
    //其它绘图绘图操作
      

  3.   

    水印图片采用png,尽量不要采用jpg或gif
      

  4.   

    用 png 格式带半透明渐变边缘的图片作水印也可以消除锯齿。或者把 GIF 格式图片缩小了再结合上面代码绘制也行。
      

  5.   

    意思是说,logo这个将要水印到jpg上面的图片,最好是png透明文件吗?
      

  6.   


    半透明的,如果全透明那还看得见吗,而且一般边缘要渐变的由半透明到全透明,这样平滑过渡锯齿就消除了。这样的图片用 Photoshop 很容易处理,发光效果处理图层就行。
      

  7.   

    这个和java程序无关啦,要看你的图片了。一般都是使用png格式的。而且也不是任何图片都显示不出来锯齿的。主要是和你png图片的颜色,和你要加水印图片的颜色有关。色差越大越容易出现锯齿。