java实现文字版P图

使用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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值