java实现文字版P图

来源:互联网 发布:java 集合框架详解 编辑:程序博客网 时间:2024/05/21 09:45
使用Graphics2D和swing做出一个图片添加文字的Demo,可以自定义文字内容,改变文字位置,颜色,字体,旋转角度。
import java.awt.AlphaComposite;import java.awt.Color;import java.awt.Font;import java.awt.Graphics2D;import java.awt.Image;import java.awt.RenderingHints;import java.awt.image.BufferedImage;import java.io.File;import java.io.FileOutputStream;import java.io.InputStream;import java.io.OutputStream;import java.io.*;import javax.imageio.ImageIO;import javax.swing.ImageIcon;import java.text.DateFormat;import java.awt.Desktop;import javax.swing.*;import java.awt.*;import java.awt.event.*;import javax.swing.event.*;import java.util.Date;import java.text.SimpleDateFormat;import java.lang.reflect.Field;@SuppressWarnings("unchecked")public class MarkPicture {        private JButton sureButton;        private JTextField showText;        private JFileChooser fileChooser;        private JButton openButton;        private JButton saveButton;        private JPanel panel2;        private JFrame frame;        private JPanel panel1;        private JSpinner myDegree;        private JList myColor;        private JList myFont;//      private JSpinner myAlpha;        private JSpinner xPos;        private JSpinner yPos;        private JLabel picture;        private JScrollPane scroll1;        private JScrollPane scroll2;         private String selectFont;//字体        private String selectColor;//颜        private String textValue;//要添加的文字        private int degValue;//旋转的角度        private int xValue;//X轴        private int yValue;//Y 轴//      private float alphaValue;//        private Font fontValue;        private Color colorValue;        private String resourcePath;        public  MarkPicture(){                frame=new JFrame();                panel1=new JPanel();                panel2=new JPanel();                picture=new JLabel();                myDegree=new JSpinner();                String [] colors={"red","green","blue","black","cyan","darkGray","gray","gray","orange","pink","magenta","yellow"};                String [] fonts={"DIALOG","DIALOG_INPUT","SANS_SERIF","SERIF","MONOSPACED"};                myColor=new JList(colors);                myColor.addListSelectionListener(new  ListSelectionListener(){                        public void valueChanged(ListSelectionEvent e){                                selectColor=(String)myColor.getSelectedValue();                                System.out.println("颜色为:"+selectColor);}});//              myColor.addListSelectionListener();                scroll1=new JScrollPane(myColor);                scroll1.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);                scroll1.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);                myColor.setVisibleRowCount(1);//用户选择旋转角度                myDegree=new JSpinner();                myDegree.addChangeListener(new ChangeListener(){                        public void stateChanged(ChangeEvent e){                                degValue=(int)myDegree.getValue();                                System.out.println("角度为:"+degValue);}});//用户选择字体                myFont=new JList(fonts);                myFont.addListSelectionListener(new  ListSelectionListener(){        selectFont=(String)myFont.getSelectedValue();                                        System.out.println("字体为"+selectFont);}});                scroll2=new JScrollPane(myFont);                scroll2.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);                scroll2.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);                myFont.setVisibleRowCount(1);        //      myAlpha=new JSpinner();                xPos=new JSpinner();//用户选择x轴距离                xPos.addChangeListener(new ChangeListener(){                        public void stateChanged(ChangeEvent e){                                xValue=(int)xPos.getValue();                                System.out.println("x轴距离:"+xValue);}});//用户选择y轴距离                yPos=new JSpinner();                yPos.addChangeListener(new ChangeListener(){                        public void stateChanged(ChangeEvent e){                                yValue=(int)yPos.getValue();                                System.out.println("y轴距离:"+yValue);}});                panel1.setLayout(new BoxLayout(panel1,BoxLayout.Y_AXIS));                openButton =new JButton("Open");                saveButton=new JButton("Save");                sureButton=new JButton("OK");                frame.getContentPane().add(BorderLayout.EAST,panel1);                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);                openButton.addActionListener(new ActionListener(){                        public void actionPerformed(ActionEvent e){                                openFile();                                System.out.println("打开图片");}});                saveButton.addActionListener(new ActionListener (){                        public void actionPerformed(ActionEvent e){}});                sureButton.addActionListener(new ActionListener(){                          public void actionPerformed(ActionEvent e){                                markText();                                System.out.println("开始P图");}});                showText=new JTextField("显示文字区域");                panel1.add(openButton);                panel1.add(saveButton);                panel1.add(showText);                panel1.add(myDegree);                panel1.add(scroll1);                panel1.add(scroll2);        //      panel1.add(myAlpha);                panel1.add(xPos);                panel1.add(yPos);                panel1.add(sureButton);                frame.setVisible(true);                frame.setBounds(200,200,400,500);}//获取系统当前时间        public String time(){                Date date=new Date();                DateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");                String time=format.format(date);                return time;}//打开图片        public void openFile(){                fileChooser=new JFileChooser();                fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);                fileChooser.showOpenDialog(null);try{                File file=fileChooser.getSelectedFile();//返回当前文件//              Desktop.getDesktop().open(file);//              ImageIO imageIO=new ImageIO();                 resourcePath=file.getAbsolutePath();                System.out.println(resourcePath);                BufferedImage image=ImageIO.read(file);                Image scaleImage=image.getScaledInstance(300,480,Image.SCALE_DEFAULT);                Icon icon=new ImageIcon(scaleImage);                picture.setIcon(icon);                panel2.add(picture);                frame.getContentPane().add(BorderLayout.CENTER,panel2);                frame.setVisible(true);}catch(IOException ex){                ex.printStackTrace();}}        public void markText(){                System.out.println("得到各项值");                textValue=(String)showText.getText();                System.out.println(textValue);//              degValue=(int)myDegree.getValue();//              xValue=(int)xPos.getValue();//              yValue=(int)yPos.getValue();//              alphaValue=(float)myAlpha.getValue();                fontValue=new Font(selectFont,Font.BOLD,50);//粗体,50磅//Color.getColor() 不起作用  用到反射  不懂             try {    Field field = Color.class.getField(selectColor);    colorValue = (Color)field.get(null);} catch (Exception e) {    colorValue = null; // Not defined}                String path="/home/zx/javaDemo/P图(文字版)/picture/"+time();//保存位置                System.out.println("开始执行操作");                markImageByText(textValue,resourcePath,path,degValue,colorValue,fontValue,xValue,yValue);}//    public static void markText() {  //      markImageByText(addText, srcImgPath, targerPath, null);   // }    /**            * 给图片添加水印文字、可设置水印文字的旋转角度     *      * @param logoText     * @param srcImgPath     * @param targerPath     * @param degree     */    public void markImageByText(String logoText,String srcImgPath,String targerPath, int degree,Color color,Font font, int positionWidth,int positionHeight) {        InputStream is = null;        OutputStream os = null;        try {            // 1、源图片            Image srcImg = ImageIO.read(new File(srcImgPath));            BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);            // 2、得到画笔对象            Graphics2D g = buffImg.createGraphics();            // 3、设置对线段的锯齿状边缘处理            g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);            g.drawImage(srcImg.getScaledInstance(srcImg.getWidth(null), srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0, null);            // 4、设置水印旋转           // if (null != degree) {                g.rotate(Math.toRadians(degree),(double) buffImg.getWidth() / 2, (double) buffImg.getHeight() / 2);           // }            // 5、设置水印文字颜色            g.setColor(color);            // 6、设置水印文字Font            g.setFont(font);            // 7、设置水印文字透明度                float alpha = 0.5f;            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,alpha));            // 8、第一参数->设置的内容,后面两个参数->文字在图片上的坐标位置(x,y)            g.drawString(logoText, positionWidth, positionHeight);            // 9、释放资源            g.dispose();            // 10、生成图片            os = new FileOutputStream(targerPath);                ImageIO.write(buffImg, "JPG", os);            System.out.println("图片完成添加水印文字");                File targetFile=new File(targerPath);                 BufferedImage image=ImageIO.read(targetFile);                Image scaleImage=image.getScaledInstance(300,480,Image.SCALE_DEFAULT);                Icon icon=new ImageIcon(scaleImage);                picture.setIcon(icon);                panel2.add(picture);        } 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();            }}        }    public static void main(String [] args){        MarkPicture mark=new MarkPicture();        mark.openFile();    }}
 Color.getColor(String name) 不起作用,使用Field类,用到反射的概念,目前有点不太明白。

添加文字之前
添加文字之后

0 0
原创粉丝点击