Quellcode durchsuchen

广州美术阅卷

YuanPan vor 7 Jahren
Ursprung
Commit
f487b289e8

+ 11 - 3
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/ScoreApi.java

@@ -23,6 +23,7 @@ import org.springframework.web.bind.annotation.*;
 import java.awt.*;
 import java.io.File;
 import java.io.IOException;
+import java.nio.charset.Charset;
 import java.util.*;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -191,7 +192,7 @@ public class ScoreApi {
             watermarkTotal = 0;
             watermarkFinished = 0;
 
-            final Font font = new Font("Symbol", Font.PLAIN, 40);                     //水印字体
+            final Font font = new Font("宋体", Font.PLAIN, 60);                     //水印字体
             final Color color = new Color(254, 3, 10, 255);                               //水印图片色彩以及透明度
             final List<Paper> papers = paperRepo.findByWorkId(workId);
             watermarkTotal = papers.size();
@@ -211,8 +212,15 @@ public class ScoreApi {
 
                     File targetFile = new File(watermarkFile);
                     targetFile.getParentFile().mkdirs();//创建父级目录
-                    WaterMarkUtils.addWaterMark(imageFile, watermarkFile, "【" + paper.getExamNumber() + "】【" + paper.getStudentName() + "】【" + String.valueOf(score.intValue()) + "分】", color, font);
-                    System.out.println(watermarkFile + "生产成功");
+                    String txt = "【" + paper.getExamNumber() + "】【" + paper.getStudentName() + "】【" + String.valueOf(score.intValue()) + "分】";
+                    String text = new String(txt.getBytes(), Charset.forName("GBK"));
+//                    WaterMarkUtils.addWaterMark(imageFile, watermarkFile, text, color, font);
+                    try {
+                        WaterMarkUtils.addTextWatermark(text, "jpg", imageFile, watermarkFile);
+                        System.out.println(watermarkFile + "生成成功");
+                    } catch (IOException e) {
+                        System.out.println(watermarkFile + "生成失败");
+                    }
 
                 }
 

+ 44 - 1
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/exporter/ScoreExporter.java

@@ -2,8 +2,13 @@ package cn.com.qmth.stmms.ms.admin.exporter;
 
 import cn.com.qmth.stmms.ms.admin.dto.ScoreDTO;
 import cn.com.qmth.stmms.ms.commons.utils.excel.ExportUtils;
+import cn.com.qmth.stmms.ms.core.domain.Paper;
+import cn.com.qmth.stmms.ms.core.domain.Student;
 import cn.com.qmth.stmms.ms.core.repository.ExamQuestionRepo;
 import cn.com.qmth.stmms.ms.core.repository.PaperRepo;
+import cn.com.qmth.stmms.ms.core.repository.StudentRepo;
+import cn.com.qmth.stmms.ms.core.vo.Subject;
+import org.apache.commons.lang.math.NumberUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
@@ -27,7 +32,10 @@ public class ScoreExporter {
     @Autowired
     private ExamQuestionRepo examQuestionRepo;
 
-    @RequestMapping(method = RequestMethod.GET)
+    @Autowired
+    private StudentRepo studentRepo;
+
+    //@RequestMapping(method = RequestMethod.GET)
     public void export(@RequestParam Long workId, HttpServletResponse response) {
         List<ScoreDTO> scoreDTOs = new ArrayList<>();
         List<Object[]> objects = paperRepo.findScores(workId);
@@ -39,11 +47,14 @@ public class ScoreExporter {
             scoreDTO.setExamNumber(o[0].toString());
             scoreDTO.setStudentName(o[1].toString());
             String scoreList = String.valueOf(o[4]);
+
             if (scoreList != null && scoreList.split(",").length == 3) {
                 scoreDTO.setSc(scoreList.split(",")[0]);
                 scoreDTO.setSm(scoreList.split(",")[1]);
                 scoreDTO.setSx(scoreList.split(",")[2]);
             }
+
+
             scoreDTO.setAreaName(areaName);
             scoreDTO.setSourceName(sourceName);
             scoreDTOs.add(scoreDTO);
@@ -51,4 +62,36 @@ public class ScoreExporter {
         String fileName = "成绩总表";
         ExportUtils.exportEXCEL(fileName, ScoreDTO.class, scoreDTOs, response);
     }
+
+    @RequestMapping(method = RequestMethod.GET)
+    public void export2(@RequestParam Long workId, HttpServletResponse response) {
+
+
+        List<ScoreDTO> scoreDTOs = new ArrayList<>();
+        List<Student> students = studentRepo.findByWorkId(workId);
+
+        for (Student student : students) {
+            ScoreDTO scoreDTO = new ScoreDTO();
+
+            scoreDTO.setSourceName(student.getSourceName());
+            scoreDTO.setAreaName(student.getAreaName());
+            scoreDTO.setExamNumber(student.getExamNumber());
+            scoreDTO.setStudentName(student.getName());
+
+            Paper sc = paperRepo.findByWorkIdAndSubjectAndExamNumber(workId, Subject.SC, student.getExamNumber());
+            Paper sm = paperRepo.findByWorkIdAndSubjectAndExamNumber(workId, Subject.SM, student.getExamNumber());
+            Paper sx = paperRepo.findByWorkIdAndSubjectAndExamNumber(workId, Subject.SX, student.getExamNumber());
+
+            int scScore = (sc == null || !NumberUtils.isNumber(String.valueOf(sc.getScore()))) ? 0 : sc.getScore().intValue();
+            int smScore = (sm == null || !NumberUtils.isNumber(String.valueOf(sm.getScore()))) ? 0 : sm.getScore().intValue();
+            int sxScore = (sx == null || !NumberUtils.isNumber(String.valueOf(sx.getScore()))) ? 0 : sx.getScore().intValue();
+            scoreDTO.setSc(String.valueOf(scScore));
+            scoreDTO.setSm(String.valueOf(smScore));
+            scoreDTO.setSx(String.valueOf(sxScore));
+
+            scoreDTOs.add(scoreDTO);
+        }
+        String fileName = "成绩总表";
+        ExportUtils.exportEXCEL(fileName, ScoreDTO.class, scoreDTOs, response);
+    }
 }

+ 71 - 2
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/utils/WaterMarkUtils.java

@@ -1,15 +1,81 @@
 package cn.com.qmth.stmms.ms.admin.utils;
 
+import javax.imageio.IIOImage;
 import javax.imageio.ImageIO;
+import javax.imageio.ImageWriteParam;
+import javax.imageio.ImageWriter;
+import javax.imageio.plugins.jpeg.JPEGImageWriteParam;
+import javax.imageio.stream.FileImageOutputStream;
 import java.awt.*;
+import java.awt.geom.Rectangle2D;
 import java.awt.image.BufferedImage;
 import java.io.File;
 import java.io.FileOutputStream;
+import java.io.IOException;
 
 /**
  * Created by yuanpan on 2017/12/13.
  */
 public class WaterMarkUtils {
+
+
+    public static void addTextWatermark(String text, String type, String sourcePath, String destinationPath) throws IOException {
+        File source = new File(sourcePath);
+        File destination = new File(destinationPath);
+        BufferedImage image = ImageIO.read(source);
+        int width = image.getWidth();
+        int height = image.getHeight();
+
+        // determine image type and handle correct transparency
+        //int imageType = "png".equalsIgnoreCase(type) ? BufferedImage.TYPE_INT_ARGB : BufferedImage.TYPE_INT_RGB;
+        BufferedImage watermarked = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB);
+
+        // initializes necessary graphic properties
+        Graphics2D w = (Graphics2D) watermarked.getGraphics();
+        w.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+        w.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
+
+        w.drawImage(image.getScaledInstance(image.getWidth(), image.getHeight(), Image.SCALE_SMOOTH), 0, 0, null);
+        AlphaComposite alphaChannel = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.4f);
+        w.setComposite(alphaChannel);
+        w.setColor(Color.red);
+        w.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 60));
+        FontMetrics fontMetrics = w.getFontMetrics();
+        Rectangle2D rect = fontMetrics.getStringBounds(text, w);
+
+        // calculate center of the image
+//        int x = (image.getWidth() - (int) rect.getWidth()) / 2;
+//        int y = image.getHeight() / 2;
+
+        int x = 0;
+        int y = image.getHeight() - (int) rect.getHeight() + 50;
+
+        // add text overlay to the image
+        w.drawString(text, x, y);
+        //ImageIO.write(watermarked, type, destination);
+        //w.dispose();
+
+
+        JPEGImageWriteParam jepgParams = new JPEGImageWriteParam(null);
+        jepgParams.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
+        jepgParams.setCompressionQuality(1f);
+        final ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next();
+        writer.setOutput(new FileImageOutputStream(destination));
+        writer.write(null, new IIOImage(watermarked, null, null), jepgParams);
+        writer.dispose();
+
+
+        w.dispose();
+
+
+//        FileOutputStream fos = new FileOutputStream(destination);
+//        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(fos);
+//        encoder.encode(watermarked);
+//        fos.flush();
+//        fos.close();
+    }
+
+
     /**
      * @param srcImgPath       源图片路径
      * @param tarImgPath       保存的图片路径
@@ -33,8 +99,11 @@ public class WaterMarkUtils {
             g.setFont(font);              //设置字体
 
             //设置水印的坐标
-            int x = srcImgWidth - getWatermarkWidth(waterMarkContent, g);
-            int y = getWatermarkHeight(g);
+//            int x = srcImgWidth - getWatermarkWidth(waterMarkContent, g);
+//            int y = getWatermarkHeight(g);
+            int x = 0;
+            int y = srcImgHeight - getWatermarkHeight(g) + 50;
+//            int y = srcImgHeight;
             g.drawString(waterMarkContent, x, y);  //画出水印
             g.dispose();
             // 输出图片

+ 63 - 1
stmms-ms-main/src/main/java/cn/com/qmth/stmms/ms/Application.java

@@ -1,18 +1,80 @@
 package cn.com.qmth.stmms.ms;
 
 
+import cn.com.qmth.stmms.ms.commons.utils.image.ImageCompression;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.scheduling.annotation.EnableAsync;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
 
+import javax.imageio.IIOImage;
+import javax.imageio.ImageIO;
+import javax.imageio.ImageWriteParam;
+import javax.imageio.ImageWriter;
+import javax.imageio.plugins.jpeg.JPEGImageWriteParam;
+import javax.imageio.stream.FileImageOutputStream;
+import java.awt.*;
+import java.awt.geom.Point2D;
+import java.awt.geom.Rectangle2D;
+import java.awt.image.BufferedImage;
+import java.awt.image.BufferedImageOp;
+import java.awt.image.ColorModel;
+import java.awt.image.ImageProducer;
+import java.io.File;
+
 @SpringBootApplication
 @EnableTransactionManagement
 @EnableAsync
-public class Application{
+public class Application {
 
     public static void main(String[] args) throws Exception {
         SpringApplication.run(Application.class, args);
     }
 
+    public static void testRotate() throws Exception {
+
+        File src = new File("/Users/yuanpan/Downloads/IMG_0762.JPG");
+        File dest = new File("/Users/yuanpan/Downloads/IMG_0762_3.JPG");
+
+        BufferedImage bufferedImage = ImageIO.read(src);
+        ColorModel colorModel = bufferedImage.getColorModel();
+        System.out.println(colorModel);
+        /*
+        String[] props = bufferedImage.getPropertyNames();
+        for (String propName : props) {
+            System.out.println("propName = "+propName);
+            Object prop = bufferedImage.getProperty(propName);
+            System.out.println(prop);
+        }
+        */
+        ImageProducer imageProducer = bufferedImage.getSource();
+        System.out.println(imageProducer);
+        bufferedImage.getData();
+
+
+        BufferedImage destImage = new BufferedImage(bufferedImage.getWidth(), bufferedImage.getHeight(), BufferedImage.TYPE_INT_RGB);
+
+        Graphics2D graphics2D = (Graphics2D) destImage.getGraphics();
+        //graphics2D.rotate(0, bufferedImage.getWidth() / 2, bufferedImage.getHeight() / 2);
+
+//        graphics2D.drawImage(bufferedImage, null, 0, 0);
+//        ImageIO.write(destImage, "jpg", dest);
+//        System.out.println("旋转完成");
+
+
+        graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+        graphics2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
+        graphics2D.drawImage(bufferedImage.getScaledInstance(bufferedImage.getWidth(), bufferedImage.getHeight(), Image.SCALE_SMOOTH), 0, 0, null);
+        JPEGImageWriteParam jepgParams = new JPEGImageWriteParam(null);
+        jepgParams.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
+        jepgParams.setCompressionQuality(1f);
+        final ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next();
+
+        writer.setOutput(new FileImageOutputStream(dest));
+        writer.write(null, new IIOImage(destImage, null, null), jepgParams);
+        writer.dispose();
+        graphics2D.dispose();
+        System.out.println("旋转完成");
+    }
+
 }

+ 1 - 0
stmms-ms-main/src/main/resources/application-gz.properties

@@ -35,6 +35,7 @@ app.admin.password=123456
 
 sys.config.imageDir=E:\\stmms-ms\\images
 sys.config.thumbDir=E:\\stmms-ms\\thumbs
+sys.config.watermark=E:\\stmms-ms\\watermark
 sys.config.compression.percent=60
 sys.config.imageServer.port=9000
 sys.config.imageServer.ip=192.168.1.100

+ 1 - 1
stmms-ms-main/src/main/resources/application.properties

@@ -1,4 +1,4 @@
-spring.profiles.active=dev
+spring.profiles.active=gz
 
 spring.datasource.url=jdbc:mysql://localhost:3306/stmms-ms-2?useUnicode=true&characterEncoding=UTF-8
 spring.datasource.username=root