程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> mage-怎麼用java圖片加文字水印ne

mage-怎麼用java圖片加文字水印ne

編輯:編程綜合問答
怎麼用java圖片加文字水印ne

要一個完整的例子,傳入的參數最好是
源文件 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;
    }
}

原始圖像:

圖片說明

結果圖像:

圖片說明

xiaoliuing
xiaoliuing
tongyi55555
tongyi55555
xiaoliuing
xiaoliuing
xiaoliuing
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved