Prechádzať zdrojové kódy

美术阅卷10月新增需求-新增分数水印

wangliang 5 rokov pred
rodič
commit
34bd9c80b0

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

@@ -3,6 +3,7 @@ package cn.com.qmth.stmms.ms.admin.api;
 import cn.com.qmth.stmms.ms.admin.assembler.ScoreAssembler;
 import cn.com.qmth.stmms.ms.admin.dto.ScoreCheckDTO;
 import cn.com.qmth.stmms.ms.admin.utils.WaterMarkUtils;
+import cn.com.qmth.stmms.ms.commons.utils.MD5Util;
 import cn.com.qmth.stmms.ms.commons.web.PageableDTO;
 import cn.com.qmth.stmms.ms.core.domain.MarkStage;
 import cn.com.qmth.stmms.ms.core.domain.Paper;
@@ -256,9 +257,11 @@ public class ScoreApi {
                     String examNumber = paper.getExamNumber();
                     String areaCode = paper.getAreaCode();
                     Subject subject = paper.getSubject();
+                    Student student = studentRepo.findByWorkIdAndExamNumber(workId, examNumber);
+                    String imageMd5 = MD5Util.getImageRuleMd5(workId, subject.ordinal(), areaCode, examNumber, student.getId());
 
-                    String imageFile = imagePath + "/" + workId + "/" + subject.toString() + "/" + areaCode + "/" + examNumber + ".jpg";
-                    String watermarkFile = watermark + "/" + workId + "/" + subject.toString() + "/" + areaCode + "/" + examNumber + ".jpg";
+                    String imageFile = imagePath + "/" + workId + "/" + subject.toString() + "/" + areaCode + "/" + imageMd5 + ".jpg";
+                    String watermarkFile = watermark + "/" + workId + "/" + subject.toString() + "/" + areaCode + "/" + imageMd5 + ".jpg";
 
                     File targetFile = new File(watermarkFile);
                     targetFile.getParentFile().mkdirs();//创建父级目录
@@ -324,11 +327,12 @@ public class ScoreApi {
 
     /**
      * 标记缺考
+     *
      * @param id
      * @return
      */
     @PostMapping("/missing/{id}")
-    public ResponseEntity doMissing(@PathVariable("id") Long id){
+    public ResponseEntity doMissing(@PathVariable("id") Long id) {
         //更新为缺考
         Paper paper = paperRepo.findOne(id);
         paper.setIsMissing(true);

+ 105 - 11
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/utils/WaterMarkUtils.java

@@ -1,23 +1,28 @@
 package cn.com.qmth.stmms.ms.admin.utils;
 
+import cn.com.qmth.stmms.ms.commons.constant.SystemConstant;
+import cn.com.qmth.stmms.ms.commons.utils.MD5Util;
+import org.slf4j.LoggerFactory;
+
 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 javax.imageio.stream.ImageInputStream;
+import javax.imageio.stream.ImageOutputStream;
 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;
+import java.io.*;
+import java.nio.charset.Charset;
 
 /**
  * Created by yuanpan on 2017/12/13.
  */
 public class WaterMarkUtils {
-
+    private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(WaterMarkUtils.class);
 
     public static void addTextWatermark(String text, String type, String sourcePath, String destinationPath) throws IOException {
         File source = new File(sourcePath);
@@ -126,13 +131,102 @@ public class WaterMarkUtils {
         return g.getFontMetrics(g.getFont()).getHeight();
     }
 
-    public static void main(String[] args) {
-        Font font = new Font("Symbol", Font.PLAIN, 60);                     //水印字体
-        String srcImgPath = "/Users/yuanpan/tmp/1842030001.jpg"; //源图片地址
-        String tarImgPath = "/Users/yuanpan/tmp/1842030002.jpg"; //待存储的地址
-        String waterMarkContent = "90分";  //水印内容
-        Color color = new Color(254, 3, 10, 255);                               //水印图片色彩以及透明度
-        WaterMarkUtils.addWaterMark(srcImgPath, tarImgPath, waterMarkContent, color, font);
+    public static void main(String[] args) throws IOException {
+//        Font font = new Font("Symbol", Font.PLAIN, 60);                     //水印字体
+        long start = System.currentTimeMillis();
+        LOGGER.info("准备生成水印图:{}", start);
+        String srcImgPath = "/Users/king/stmms-ms/static/images/6/SX/2/27e80f728ec8171eb56f834b67e919f9.jpg"; //源图片地址
+        String srcImgTempPath = "/Users/king/stmms-ms/static/images/6/SX/2/27e80f728ec8171eb56f834b67e919f9Temp.jpg";
+        String tarImgPath = "/Users/king/stmms-ms/static/watermark/6/SX/2"; //待存储的地址
+//        String waterMarkContent = "90分";  //水印内容
+//        Color color = new Color(254, 3, 10, 255);                               //水印图片色彩以及透明度
+//        WaterMarkUtils.addWaterMark(srcImgPath, tarImgPath, waterMarkContent, color, font);
+        //读取指定路径下面的文件
+        InputStream inputStream = new FileInputStream(srcImgPath);
+        OutputStream outputStream = new FileOutputStream(srcImgTempPath);
+        int index = 0;
+        byte[] bytes = new byte[1024];
+        byte[] bytesEnc = new byte[1024];
+        while ((index = inputStream.read(bytes)) != -1) {
+            //将字节数组的数据全部写入到输出流中
+            for (int i = 0; i < index; i++) {
+                //通过异或运算加密
+                bytesEnc[i] = (byte) (bytes[i] ^ SystemConstant.SECRET_KEY);
+            }
+            outputStream.write(bytesEnc, 0, index);
+        }
+        String txt = "【" + "1842030002" + "】【" + "test1" + "】【" + String.valueOf(100) + "分】";
+        String text = new String(txt.getBytes(), Charset.forName("UTF-8"));
+        File source = new File(srcImgTempPath);
+        File destination = new File("/Users/king/stmms-ms/static/images/6/SX/2/1842030002temp.jpg");
+        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();
+        source.delete();
+
+        inputStream = new FileInputStream(destination);
+        destination.delete();
+        outputStream.flush();
+        File file = new File(tarImgPath);
+        if (!file.exists()) {
+            file.mkdirs();
+        }
+        String imageMd5 = "27e80f728ec8171eb56f834b67e919f9";
+        File sheetFile = new File(tarImgPath + File.separator + imageMd5 + ".jpg");
+        outputStream = new FileOutputStream(sheetFile);
+        index = 0;
+        bytes = new byte[1024];
+        bytesEnc = new byte[1024];
+        while ((index = inputStream.read(bytes)) != -1) {
+            //将字节数组的数据全部写入到输出流中
+            for (int i = 0; i < index; i++) {
+                //通过异或运算加密
+                bytesEnc[i] = (byte) (bytes[i] ^ SystemConstant.SECRET_KEY);
+            }
+            outputStream.write(bytesEnc, 0, index);
+        }
 
+        long end = System.currentTimeMillis();
+        LOGGER.info("生成水印图耗时:{}", (end - start) / 1000 + "s");
+//        WaterMarkUtils.addTextWatermark(text, "jpg", srcImgPath, tarImgPath);
     }
 }

+ 1 - 1
stmms-ms-collect/src/main/java/cn/com/qmth/stmms/ms/collect/api/CollectApi.java

@@ -346,7 +346,7 @@ public class CollectApi {
                     break;
                 default:
                     //分数水印图
-                    path = systemConfig.getSheetDir() + File.separator + workId + File.separator + subject
+                    path = systemConfig.getWatermark() + File.separator + workId + File.separator + subject
                             + File.separator + student.getAreaCode();
                     break;
             }

+ 18 - 0
stmms-ms-commons/src/main/java/cn/com/qmth/stmms/ms/commons/config/SystemConfig.java

@@ -32,6 +32,19 @@ public class SystemConfig {
      */
     private String sheetDir;
 
+    /**
+     * 分数水印目录
+     */
+    private String watermark;
+
+    public String getWatermark() {
+        return watermark;
+    }
+
+    public void setWatermark(String watermark) {
+        this.watermark = watermark;
+    }
+
     public String getImageDir() {
         return imageDir;
     }
@@ -63,6 +76,11 @@ public class SystemConfig {
                 + subject + "/" + areaCode + "/" + examNumber + ".jpg?random=" + UUID.randomUUID().toString();
     }
 
+    public String getWaterMarkUrl(Long workId,String subject,String areaCode,String examNumber){
+        return imageServerConfig.getImageServer() + "/watermark/" + String.valueOf(workId) + "/"
+                + subject + "/" + areaCode + "/" + examNumber + ".jpg?random=" + UUID.randomUUID().toString();
+    }
+
 	public String getSheetDir() {
 		return sheetDir;
 	}