long类型按位取 转成对象 对象转long

package com.xxx.services.cmp.conference.utils;

import com.xxx.modules.cmp.cmp.dto.*;
import com.xxx.modules.cmp.cmp.model.NameplateImageData;
import com.xxx.modules.cmp.cmp.model.NameplateTemplateData;
import com.xxx.modules.cmp.cmp.model.NameplateTemplateDataAll;
import com.xxx.modules.cmp.cmp.model.NameplateTextData;
import com.xxx.modules.cmp.cmp.types.nameplate.NameplateImageSettingType;
import com.xxx.modules.cmp.cmp.types.nameplate.NameplateTextSettingType;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Base64;
import java.util.List;

/**
 * @author yws
 * @BelongsProject: taiden-platform
 * @BelongsPackage: com.xxxx.services.cmp.conference.utils
 * @CreateTime: 2022-11-17 09:38
 * @Description: 根据二进制信息解析成对象
 */
public class AnalysisCmpNamePlateTemplateUtils {


    /**
     * 解析名牌模板数据
     *
     * @param nameplateTemplate
     * @return
     */
    public static List<NameplateTemplateDataDTO> analysisNamePlateTemplate(byte[] nameplateTemplate) {

        if (nameplateTemplate == null) {
            return null;
        }

        List<NameplateTemplateDataDTO> nameplateTemplateDataDTOList = new ArrayList<>();

        // 模板数量
        byte templateCount = nameplateTemplate[0];

        for (int i = 0; i < templateCount; i++) {

            // 单个模板返回数据
            NameplateTemplateDataDTO nameplateTemplateDataDTO = new NameplateTemplateDataDTO();

            // 解析原始数据
            NameplateTemplateData nameplateTemplateData = new NameplateTemplateData();
            byte[] data = new byte[308570];
            System.arraycopy(nameplateTemplate, 1 + 308570 * i, data, 0, 308570);
            nameplateTemplateData.fromBytes(data);

            if (nameplateTemplateData == null) {
                return null;
            }

            // 反色
            nameplateTemplateDataDTO.setRevert((int) nameplateTemplateData.getRevert());

            // 分辨率
            nameplateTemplateDataDTO.setResolution((int) nameplateTemplateData.getResolution());

            // 图片数量
            int imageCount = nameplateTemplateData.getImageCount();

            //  图片内容
            NameplateImageData[] imageData = nameplateTemplateData.getImageData();

            List<NameplateImageDataDTO> nameplateImageDataDTOList = new ArrayList<>();
            for (int k = 0; k < imageCount; k++) {

                //  单个图片原始数据
                NameplateImageData nameplateImageData = imageData[k];

                // 解析图片原始数据
                NameplateImageDataDTO nameplateImageDataDTO = analysisNameplateImageData(nameplateImageData);

                nameplateImageDataDTOList.add(nameplateImageDataDTO);
            }

            nameplateTemplateDataDTO.setImageData(nameplateImageDataDTOList);

            // 文本数量
            int textCount = nameplateTemplateData.getTextCount();

            // 文本内容
            NameplateTextData[] textData = nameplateTemplateData.getTextData();

            List<NameplateTextDataDTO> nameplateTextDataDTOArrayList = new ArrayList<>();
            for (int j = 0; j < textCount; j++) {

                //  单个文本原始数据
                NameplateTextData nameplateTextData = textData[j];

                // 解析文本原始数据
                NameplateTextDataDTO nameplateTextDataDTO = analysisNameplateTextData(nameplateTextData);

                nameplateTextDataDTOArrayList.add(nameplateTextDataDTO);

            }

            nameplateTemplateDataDTO.setTextData(nameplateTextDataDTOArrayList);


            // 制造商
            byte[] manufacturer = nameplateTemplateData.getManufacturer();
            String manufacturerStr = null;
            try {
                manufacturerStr = new String(manufacturer, "UTF-8").trim();
                nameplateTemplateDataDTO.setManufacturer(manufacturerStr);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }


            // 文本类型
            byte[] fileType = nameplateTemplateData.getFileType();
            String fileTypeStr = null;
            try {
                fileTypeStr = new String(fileType, "UTF-8").trim();
                nameplateTemplateDataDTO.setFileType(fileTypeStr);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }


            // 名称
            byte[] name = nameplateTemplateData.getName();
            String nameStr = null;
            try {
                nameStr = new String(name, "UTF-8").trim();
                nameplateTemplateDataDTO.setName(nameStr);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }


            // 版本
            byte[] version = nameplateTemplateData.getVersion();
            String versionStr = null;
            try {
                versionStr = new String(version, "UTF-8").trim();
                nameplateTemplateDataDTO.setVersion(versionStr);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }

            // 背景色
            long backGround = nameplateTemplateData.getBackGround();
            nameplateTemplateDataDTO.setBackGround(backGround);


            nameplateTemplateDataDTOList.add(nameplateTemplateDataDTO);
        }
        return nameplateTemplateDataDTOList;

    }


    /**
     * 解析名牌文本
     *
     * @param nameplateTextData
     * @return
     */
    public static NameplateTextDataDTO analysisNameplateTextData(NameplateTextData nameplateTextData) {

        if (nameplateTextData == null) {
            return null;
        }

        NameplateTextDataDTO nameplateTextDataDTO = new NameplateTextDataDTO();

        // 文本内容
        byte[] text = nameplateTextData.getText();
        String textStr = null;
        try {
            textStr = new String(text, "UTF-8").trim();
            nameplateTextDataDTO.setText(textStr);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        // x坐标
        nameplateTextDataDTO.setX(nameplateTextData.getX());

        // Y坐标
        nameplateTextDataDTO.setY(nameplateTextData.getY());

        // 文本区域宽度
        nameplateTextDataDTO.setWidth(nameplateTextData.getWidth());

        // 文本区域高度
        nameplateTextDataDTO.setHeight(nameplateTextData.getHeight());

        // 字体ID
        nameplateTextDataDTO.setFontFamily(nameplateTextData.getFontFamily());

        // 字号
        nameplateTextDataDTO.setFontSize(nameplateTextData.getFontSize());

        // 其他设置
        nameplateTextDataDTO.setSettings(nameplateTextData.getSettings());


        // 解析文本Setting
        Long settings = nameplateTextDataDTO.getSettings();
        if (settings != null) {
            NameplateTextSettingDTO nameplateTextSettingDTO = analysisNameplateTextData(nameplateTextDataDTO.getSettings());
            nameplateTextDataDTO.setSettingDetails(nameplateTextSettingDTO);
        }

        // 排序
        nameplateTextDataDTO.setOrderIndex(nameplateTextData.getOrderIndex());

        return nameplateTextDataDTO;
    }


    // 解析名牌图片
    public static NameplateImageDataDTO analysisNameplateImageData(NameplateImageData nameplateImageData) {

        if (nameplateImageData == null) {
            return null;
        }

        NameplateImageDataDTO nameplateImageDataDTO = new NameplateImageDataDTO();

        //   x坐标
        nameplateImageDataDTO.setX(nameplateImageData.getX());

        // y 坐标
        nameplateImageDataDTO.setY(nameplateImageData.getY());

        // 图片区域宽度
        nameplateImageDataDTO.setWidth(nameplateImageData.getWidth());


        // 图片区域高度
        nameplateImageDataDTO.setHeight(nameplateImageData.getHeight());

        // 其他设置
        nameplateImageDataDTO.setSettings(nameplateImageData.getSettings());

        // 排序
        nameplateImageDataDTO.setOrderIndex(nameplateImageData.getOrderIndex());

        // 解析Setting
        Long settings = nameplateImageData.getSettings();
        if (settings != null) {
            NameplateImageSettingDTO nameplateTextSettingDTO = analysisNameplateImageData(nameplateImageData.getSettings());
            nameplateImageDataDTO.setSettingDetails(nameplateTextSettingDTO);
        }

        // 图片
        byte[] image = nameplateImageData.getImage();

        if (image != null) {
            String base64Str = Base64.getEncoder().encodeToString(image);
            nameplateImageDataDTO.setImage(base64Str);
        }


        return nameplateImageDataDTO;
    }


    // 解析文本Setting
    public static NameplateTextSettingDTO analysisNameplateTextData(long settings) {

        boolean isBold = NameplateTextSettingType.getBooleanValue(NameplateTextSettingType.IS_BOLD, settings);

        boolean isItalic = NameplateTextSettingType.getBooleanValue(NameplateTextSettingType.IS_ITALIC, settings);

        boolean isUnderline = NameplateTextSettingType.getBooleanValue(NameplateTextSettingType.IS_UNDERLINE, settings);

        boolean isStrikeOut = NameplateTextSettingType.getBooleanValue(NameplateTextSettingType.IS_STRIKEOUT, settings);

        boolean isUpper = NameplateTextSettingType.getBooleanValue(NameplateTextSettingType.IS_UPPER, settings);

        boolean isStretch = NameplateTextSettingType.getBooleanValue(NameplateTextSettingType.IS_STRETCH, settings);

        boolean isRevert = NameplateTextSettingType.getBooleanValue(NameplateTextSettingType.REVERT, settings);

        int textAlignment = NameplateTextSettingType.getIntValue(NameplateTextSettingType.TEXT_ALIGNMENT, settings);

        int verticalAlignment = NameplateTextSettingType.getIntValue(NameplateTextSettingType.VERTICAL_ALIGNMENT, settings);

        int dataSourceValue = NameplateTextSettingType.getIntValue(NameplateTextSettingType.DATA_SOURCE_VAL, settings);

        boolean isAutoFontSize = NameplateTextSettingType.getBooleanValue(NameplateTextSettingType.AUTO_FIT, settings);

        int spaceCount = NameplateTextSettingType.getIntValue(NameplateTextSettingType.SPACE_COUNT, settings);

        //boolean autoWrap = NameplateTextSettingType.getIntValue(NameplateTextSettingType.AUTO_WRAP, settings) == 1;

        boolean autoWrap = ((settings & NameplateTextSettingType.AUTO_WRAP.getCode()) >> NameplateTextSettingType.AUTO_WRAP.getPos()) == 1;

        int backColor = NameplateTextSettingType.getIntValue(NameplateTextSettingType.BACK_GROUND_COLOR, settings);

        int foreColor = NameplateTextSettingType.getIntValue(NameplateTextSettingType.FORE_GROUND_COLOR, settings);


//        boolean isBold = (settings & 1) == 1;
//        boolean isItalic = (settings & 2) == 2;
//        boolean isUnderline = (settings & 4) == 4;
//        boolean isStrikeOut = (settings & 8) == 8;
//        boolean isUpper = (settings & 16) == 16;
//        boolean isStretch = (settings & 32) == 32;
//        boolean isRevert = (settings & 64) == 64;
//
//        int textAlignment = (int) ((settings & 0x180) >> 7); // bit7-8: 水平对齐
//
//        int verticalAlignment = (int) ((settings & 0x600) >> 9); // bit9-10: 垂直对齐
//
//        int dataSourceValue = (int) ((settings & 0xF800) >> 11); // bit11-15: 代表值
//
//
//        boolean isAutoFontSize = (settings & 0x10000) == 0x10000; // bit16: 是否自适应字体
//
//        int spaceCount = (int) ((settings & 0x1E0000) >> 17);    // bit17-20: 空格数
//
//        boolean autoWrap = ((settings & 0x200000) >> 21) == 1;     // bit21: 自动换行
//
        int autoWrapMinFontSize = 50; //(text.Setting & 0x3FC00000) >> 22; // bit22-29: 自动换行自小字体(弃用)
//
//
//        int backColor = (int) ((settings & (0x0F << 22)) >> 22);  // bit22-25: 背景色
//
//        int foreColor = (int) ((settings & (0x0F << 26)) >> 26);  // bit26-29: 前景色

        NameplateTextSettingDTO nameplateTextSettingDTO = new NameplateTextSettingDTO();
        nameplateTextSettingDTO.setBold(isBold);
        nameplateTextSettingDTO.setItalic(isItalic);
        nameplateTextSettingDTO.setUnderLine(isUnderline);
        nameplateTextSettingDTO.setStrikeOut(isStrikeOut);
        nameplateTextSettingDTO.setUpper(isUpper);
        nameplateTextSettingDTO.setStretch(isStretch);
        nameplateTextSettingDTO.setRevert(isRevert);
        nameplateTextSettingDTO.setTextAlignment(textAlignment);
        nameplateTextSettingDTO.setVerticalAlignment(verticalAlignment);
        nameplateTextSettingDTO.setDataSourceValue(dataSourceValue);
        nameplateTextSettingDTO.setAutoFit(isAutoFontSize);
        nameplateTextSettingDTO.setSpaceCount(spaceCount);
        nameplateTextSettingDTO.setAutoWrap(autoWrap);
        nameplateTextSettingDTO.setBackgroundColor(backColor);
        nameplateTextSettingDTO.setForegroundColor(foreColor);

        return nameplateTextSettingDTO;
    }


    // 解析图片Setting
    public static NameplateImageSettingDTO analysisNameplateImageData(long settings) {


        //int dataSourceValue = (int) ((settings & (0x0F << 0)) >> 0)    ;  // bit0-3: 数据源值ID
        //
        //int textAlignment = (int) ((settings & 0x30) >> 4); // bit4-5: 水平对齐
        //int verticalAlignment = (int) ((settings & 0xC0) >> 6); // bit6-7: 垂直对齐
        //
        //int stretch = (int) ((settings & 0X300) >> 8); // bit8-9: 拉伸方式
        //
        //int backColor = (int) ((settings & (0x0F << 10)) >> 10);  // bit10-13: 背景色


        int dataSourceValue = NameplateImageSettingType.getIntValue(NameplateImageSettingType.DATA_SOURCE_VAL, settings);

        int textAlignment = NameplateImageSettingType.getIntValue(NameplateImageSettingType.TEXT_ALIGNMENT, settings);

        int verticalAlignment = NameplateImageSettingType.getIntValue(NameplateImageSettingType.VERTICAL_ALIGNMENT, settings);

        int stretch = NameplateImageSettingType.getIntValue(NameplateImageSettingType.IS_STRETCH, settings);

        int backColor = NameplateImageSettingType.getIntValue(NameplateImageSettingType.BACK_GROUND_COLOR, settings);


        NameplateImageSettingDTO nameplateImageSettingDTO = new NameplateImageSettingDTO();

        nameplateImageSettingDTO.setDataSourceValue(dataSourceValue);
        nameplateImageSettingDTO.setTextAlignment(textAlignment);
        nameplateImageSettingDTO.setVerticalAlignment(verticalAlignment);
        nameplateImageSettingDTO.setStretch(stretch);
        nameplateImageSettingDTO.setBackgroundColor(backColor);

        return nameplateImageSettingDTO;
    }


    /**
     * 解析名牌模板对象成byte数组
     *
     * @param templateDataDetails
     * @return
     */
    public static byte[] analysisNameplateObject(List<NameplateTemplateDataDTO> templateDataDetails) {
        if (templateDataDetails == null) {
            return null;
        }

        byte size = (byte) templateDataDetails.size();

        NameplateTemplateDataAll nameplateTemplateDataAll = new NameplateTemplateDataAll();

        nameplateTemplateDataAll.setTemplateCount(size);

        // 模板数据
        NameplateTemplateData[] nameplateTemplateDataArr = new NameplateTemplateData[4];

        for (int i = 0; i < templateDataDetails.size(); i++) {

            NameplateTemplateData nameplateTemplateData = new NameplateTemplateData();

            NameplateTemplateDataDTO nameplateTemplateDataDTO = templateDataDetails.get(i);

            if (nameplateTemplateDataDTO == null) {
                return null;
            }


            // 分辨率: 0: 1200*232; 1: 640*384; 2: 1904*464; 3: 800*480
            if (nameplateTemplateDataDTO.getResolution() != null) {
                byte resolution = (byte) nameplateTemplateDataDTO.getResolution().intValue();
                nameplateTemplateData.setResolution(resolution);
            }


            // 是否整个区域反色
            if (nameplateTemplateDataDTO.getRevert() != null) {
                byte revert = (byte) nameplateTemplateDataDTO.getRevert().intValue();
                nameplateTemplateData.setRevert(revert);
            }


            // 文本内容
            List<NameplateTextDataDTO> textDataList = nameplateTemplateDataDTO.getTextData();

            if (textDataList != null && textDataList.size() > 0) {
                nameplateTemplateData = analysisTextDataObject(textDataList, nameplateTemplateData);
            }

            // 图片内容
            List<NameplateImageDataDTO> imageDataList = nameplateTemplateDataDTO.getImageData();

            if (imageDataList != null && imageDataList.size() > 0) {
                nameplateTemplateData = analysisImageDataObject(imageDataList, nameplateTemplateData);
            }


            // 制造商
            String manufacturer = nameplateTemplateDataDTO.getManufacturer();
            if (manufacturer != null && !"".equals(manufacturer)) {
                // 制造商 (uft8编码字符,最大128个字符)
                byte[] manufacturerByte = new byte[128];
                try {
                    manufacturerByte = manufacturer.getBytes("UTF-8");
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
                nameplateTemplateData.setManufacturer(manufacturerByte);
            } else {
                nameplateTemplateData.setManufacturer(new byte[128]);
            }


            // 文件类型
            String fileType = nameplateTemplateDataDTO.getFileType();
            if (fileType != null && !"".equals(fileType)) {
                // 文件类型 (uft8编码字符,最大128个字符)
                byte[] fileTypeByte = new byte[128];
                try {
                    fileTypeByte = fileType.getBytes("UTF-8");
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
                nameplateTemplateData.setFileType(fileTypeByte);
            } else {
                nameplateTemplateData.setFileType(new byte[128]);
            }


            // 名称
            String name = nameplateTemplateDataDTO.getName();
            if (name != null && !"".equals(name)) {
                // 名称 (uft8编码字符,最大128个字符)
                byte[] nameByte = new byte[128];
                try {
                    nameByte = name.getBytes("UTF-8");
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
                nameplateTemplateData.setName(nameByte);
            } else {
                nameplateTemplateData.setName(new byte[128]);
            }


            // 版本
            String version = nameplateTemplateDataDTO.getManufacturer();
            if (version != null && !"".equals(version)) {
                // 制造商 (uft8编码字符,最大128个字符)
                byte[] versionByte = new byte[128];
                try {
                    versionByte = version.getBytes("UTF-8");
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
                nameplateTemplateData.setVersion(versionByte);
            } else {
                nameplateTemplateData.setVersion(new byte[128]);
            }


            // 背景色
            Long backGround = nameplateTemplateDataDTO.getBackGround();
            if (backGround != null) {
                nameplateTemplateData.setBackGround(backGround);
            } else {
                nameplateTemplateData.setBackGround(0L);
            }


            nameplateTemplateDataArr[i] = nameplateTemplateData;
        }

        nameplateTemplateDataAll.setNameplateTemplateData(nameplateTemplateDataArr);

        byte[] bytes = nameplateTemplateDataAll.toBytes();

        return bytes;

    }


    /**
     * 解析文本Setting对象 转long
     *
     * @param settingDetails
     * @return
     */
    public static long analysisTextSettingObject(NameplateTextSettingDTO settingDetails) {

        // 设置字段
        long settings = 0;

        if (settingDetails == null) {
            return settings;
        }

        try {
            if (settingDetails.isBold()) {
                settings = settings | (0x01 << 0);
            }
            if (settingDetails.isItalic()) {
                settings = settings | (0x01 << 1);
            }
            if (settingDetails.isUnderLine()) {
                settings = settings | (0x01 << 2);
            }
            if (settingDetails.isStrikeOut()) {
                settings = settings | (0x01 << 3);
            }
            if (settingDetails.isUpper()) {
                settings = settings | (0x01 << 4);
            }
            if (settingDetails.isStretch()) {
                settings = settings | (0x01 << 5);
            }
            if (settingDetails.isRevert()) {
                settings = settings | (0x01 << 6);
            }

            // 水平居中 bit7-8
            settings = settings | (settingDetails.getTextAlignment() << 7);

            // 垂直居中 //bit9-10
            settings = settings | (settingDetails.getVerticalAlignment() << 9);

            // 代表值 bit11-15:
            settings = settings | (settingDetails.getDataSourceValue() << 11);

            // 字体自适应 bit16
            if (settingDetails.isAutoFit()) {
                settings = settings | (0x01 << 16);
            }

            // space count bit17-20
            settings = settings | (settingDetails.getSpaceCount() << 17);

            // auto wrap bit21
            if (settingDetails.isAutoWrap()) {
                settings = settings | (0x01 << 21);
            }

            // auto wrap min font size (bit22-29) (弃用2022.1.12)
            // settings = settings | (jsonText.AutoWrapMinFontSize << 22 );

            // 背景色 bit22-25(四位可表示16种颜色)
            settings = settings | (settingDetails.getBackgroundColor() << 22);

            // 前景色 bit26-29(四位可表示16种颜色)
            settings = settings | (settingDetails.getForegroundColor() << 26);

            // 自动换行字体最小大小为 50
            // if (jsonText.AutoWrap && jsonText.FontSize < this.minFontSizeAutoWrap) {
            //   jsonText.FontSize = this.minFontSizeAutoWrap;
            // }
        } catch (Exception e) {
            return settings;
        }

        return settings;

    }


    /**
     * 解析图片Setting对象 转long
     *
     * @param settingDetails
     * @return
     */
    public static long analysisImageSettingObject(NameplateImageSettingDTO settingDetails) {

        // 设置字段
        long settings = 0;

        if (settingDetails == null) {
            return settings;
        }

        try {

            // 数据源值 bit0-3
            settings = settings | (settingDetails.getDataSourceValue() << 0);

            // 水平对齐 //bit4-5
            settings = settings | (settingDetails.getTextAlignment() << 4);

            // 垂直对齐 bit6-7
            settings = settings | (settingDetails.getVerticalAlignment() << 6);

            // 拉伸方式 bit8-9
            settings = settings | (settingDetails.getStretch() << 8);

            // 背景色 bit10-13(四位可表示16种颜色)
            settings = settings | (settingDetails.getBackgroundColor() << 10);

        } catch (Exception e) {
            return settings;
        }

        return settings;

    }

    /**
     * 解析文本内容转  nameplateTextData
     *
     * @param textDataList
     * @return
     */
    public static NameplateTemplateData analysisTextDataObject(List<NameplateTextDataDTO> textDataList, NameplateTemplateData nameplateTemplateData) {

        // 文本数量
        nameplateTemplateData.setTextCount((byte) textDataList.size());

        NameplateTextData[] textData = new NameplateTextData[5];

        for (int j = 0; j < 5; j++) {

            NameplateTextDataDTO nameplateTextDataDTO;
            try {
                nameplateTextDataDTO = textDataList.get(j);
            } catch (Exception ex) {
                nameplateTextDataDTO = null;
            }


            if (nameplateTextDataDTO != null) {

                NameplateTextData nameplateTextData = new NameplateTextData();

                // 文本内容 (uft8编码字符,最大128个字符)
                byte[] textByte = new byte[0];
                try {
                    textByte = nameplateTextDataDTO.getText().getBytes("UTF-8");
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
                nameplateTextData.setText(textByte);

                // x坐标
                nameplateTextData.setX(nameplateTextDataDTO.getX());

                // y坐标
                nameplateTextData.setY(nameplateTextDataDTO.getY());

                // 文本区域宽度
                nameplateTextData.setWidth(nameplateTextDataDTO.getWidth());

                // 文本区域高度
                nameplateTextData.setHeight(nameplateTextDataDTO.getHeight());

                // 字体ID
                nameplateTextData.setFontFamily(nameplateTextDataDTO.getFontFamily());

                // 字号
                nameplateTextData.setFontSize(nameplateTextDataDTO.getFontSize());

                // 其他设置
                NameplateTextSettingDTO settingDetails = nameplateTextDataDTO.getSettingDetails();

                long settings = analysisTextSettingObject(settingDetails);

                nameplateTextData.setSettings(settings);

                // 排序位置
                nameplateTextData.setOrderIndex(nameplateTextDataDTO.getOrderIndex());

                textData[j] = nameplateTextData;
            } else {
                textData[j] = new NameplateTextData();
            }
        }

        nameplateTemplateData.setTextData(textData);

        return nameplateTemplateData;

    }


    /**
     * 解析图片内容转  nameplateImageData
     *
     * @param imageDataList
     * @return
     */
    public static NameplateTemplateData analysisImageDataObject(List<NameplateImageDataDTO> imageDataList, NameplateTemplateData nameplateTemplateData) {
        // 图片数量
        nameplateTemplateData.setImageCount((byte) imageDataList.size());

        // 图片内容
        NameplateImageData[] imageData = new NameplateImageData[3];
        for (int k = 0; k < 3; k++) {

            NameplateImageDataDTO nameplateImageDataDTO;

            try {
                nameplateImageDataDTO = imageDataList.get(k);
            } catch (Exception ex) {
                nameplateImageDataDTO = null;
            }

            if (nameplateImageDataDTO != null) {

                NameplateImageData nameplateImageData = new NameplateImageData();

                // x坐标
                nameplateImageData.setX(nameplateImageDataDTO.getX());

                // y坐标
                nameplateImageData.setY(nameplateImageDataDTO.getY());

                // 图片区域宽度
                nameplateImageData.setWidth(nameplateImageDataDTO.getWidth());

                // 图片区域高度
                nameplateImageData.setHeight(nameplateImageDataDTO.getHeight());

                // 其他设置
                NameplateImageSettingDTO settingDetails = nameplateImageDataDTO.getSettingDetails();

                long settings = analysisImageSettingObject(settingDetails);

                nameplateImageData.setSettings(settings);

                //  图片内容
                String image = nameplateImageDataDTO.getImage();
                if (image != null) {

                    byte[] imageByte = Base64.getDecoder().decode(image);

                    nameplateImageData.setImage(imageByte);
                }

                // 图片位置
                nameplateImageData.setOrderIndex(nameplateImageDataDTO.getOrderIndex());

                imageData[k] = nameplateImageData;
            } else {
                imageData[k] = new NameplateImageData();
            }

        }

        nameplateTemplateData.setImageData(imageData);

        return nameplateTemplateData;
      
    }


}
package com.xxx.modules.cmp.cmp.model;

import com.xxx.common.structs.StructBasic;
import com.xxx.common.structs.TStruct;
import com.xxx.common.structs.TStructGlobal;
import lombok.Getter;
import lombok.Setter;

/**
 * @author yws
 * @BelongsProject: xxx-platform
 * @BelongsPackage: com.xxx.services.rmtp.models
 * @CreateTime: 2022-11-30 14:14
 * @Description: 单个分辨率下的 整个模板结构(大小: 308570)
 */
@Getter
@Setter
public class NameplateTemplateData extends StructBasic {

    public NameplateTemplateData() {
        // 注意要先初始化数组 !!!
        for (int i = 0; i < 5; i++) {
            textData[i] = new NameplateTextData();
        }

        for (int i = 0; i < 3; i++) {
            imageData[i] = new NameplateImageData();
        }
    }


    /**
     * 分辨率: 0: 1200*232; 1: 640*384; 2: 1904*464; 3: 800*480
     */
    @TStruct(order = 0, dataType = TStructGlobal.UINT8, dataLength = 1)
    public byte resolution;

    /**
     * 是否整个区域反色
     */
    @TStruct(order = 1, dataType = TStructGlobal.UINT8, dataLength = 1)
    public byte revert;


    /**
     * 文本个数(最大5个)
     */
    @TStruct(order = 2, dataType = TStructGlobal.UINT8, dataLength = 1)
    public byte textCount;

    /**
     * 文本内容
     */
    @TStruct(order = 3, dataType = TStructGlobal.STRUCT, arrayLength = 5, dataLength = 156)
    public NameplateTextData[] textData = new NameplateTextData[5];

    /**
     * 图片个数(最大3个)
     */
    @TStruct(order = 4, dataType = TStructGlobal.UINT8, dataLength = 1)
    public byte imageCount;

    /**
     * 图片内容
     */
    @TStruct(order = 5, dataType = TStructGlobal.STRUCT, arrayLength = 3, dataLength = 102424)
    public NameplateImageData[] imageData = new NameplateImageData[3];


    /**
     * 制造商 (uft8编码字符,最大128个字符) yws 2022 11 23
     */
    @TStruct(order = 0, dataType = TStructGlobal.UINT8, arrayLength = 128)
    public byte[] manufacturer = new byte[128];


    /**
     * 文件类型 (uft8编码字符,最大128个字符) yws 2022 11 23
     */
    @TStruct(order = 0, dataType = TStructGlobal.UINT8, arrayLength = 128)
    public byte[] fileType = new byte[128];


    /**
     * 名字 (uft8编码字符,最大128个字符) yws 2022 11 23
     */
    @TStruct(order = 0, dataType = TStructGlobal.UINT8, arrayLength = 128)
    public byte[] name = new byte[128];


    /**
     * 版本 (uft8编码字符,最大128个字符)  yws 2022 11 23
     */
    @TStruct(order = 0, dataType = TStructGlobal.UINT8, arrayLength = 128)
    public byte[] version = new byte[128];


    /**
     * 背景色 yws 2022 11 23
     */
    @TStruct(order = 1, dataType = TStructGlobal.UINT16, dataLength = 2)
    public long backGround;


    @Override
    public int getSize() {
        return 1 * 3 + 156 * 5 + 1 + 102424 * 3 + 128 * 4 + 2; // 308570
    }
}

package com.xxx.modules.cmp.cmp.dto;

import lombok.Data;

/**
 * @author yws
 * @BelongsProject: xxx-platform
 * @BelongsPackage: com.taiden.modules.cmp.dto
 * @CreateTime: 2022-11-28 11:18
 * @Description: 名牌模板图片结构(102424字节)
 */
@Data
public class NameplateImageDataDTO {
    /**
     * x坐标
     */
    private long x;

    /**
     * Y坐标
     */
    private long y;

    /**
     * 图片区域宽度
     */
    private long width;

    /**
     * 图片区域高度
     */
    private long height;

    /**
     * 其他设置
     */
    private long settings;


    /**
     * 配置解析
     */
    private NameplateImageSettingDTO settingDetails;

    /**
     * 图片内容 (最大100k)
     */
    private String image;


    /**
     * 排序
     */
    private long orderIndex;

}

package com.xxx.modules.cmp.cmp.dto;

import lombok.Data;

/**
 * @author yws
 * @BelongsProject: xxx-platform
 * @BelongsPackage: com.xxx.modules.cmp.dto
 * @CreateTime: 2022-11-28 11:18
 * @Description: 名牌图片设置解析
 */
@Data
public class NameplateImageSettingDTO {

    /**
     * 其他设置
     * bit0-3: DataSourceValue(数据源值ID, 如[姓名],[部门],[公司],[职位]...),
     * bit4-5: TextAlignment(水平对齐),
     * bit6-7: VerticalAlignment(垂直对齐),
     * bit8-9: stretch(拉伸方式),
     * bit10-13: 背景色(可表示16种颜色,目前只支持三种:0:白色 1:黑色 2:红色)
     *
     */

    /**
     * 数据源值ID
     */
    private int dataSourceValue;


    /**
     * 水平对齐
     */
    private int textAlignment;


    /**
     * 垂直对齐
     */
    private int verticalAlignment;


    /**
     * 拉伸方式
     */
    private int stretch;


    /**
     * 背景色(可表示16种颜色,目前只支持三种:0:白色 1:黑色 2:红色)
     */
    private int backgroundColor;


}

package com.xxx.modules.cmp.cmp.model;

import com.xxx.common.structs.StructBasic;
import com.xxx.common.structs.TStruct;
import com.xxx.common.structs.TStructGlobal;
import lombok.Getter;
import lombok.Setter;

/**
 * @author yws
 * @BelongsProject: xxx-platform
 * @BelongsPackage: com.xxx.services.rmtp.models
 * @CreateTime: 2022-11-30 14:14
 * @Description: 名牌模板图片结构(102424字节)
 */
@Getter
@Setter
public class NameplateImageData extends StructBasic {
    /**
     * x坐标
     */
    @TStruct(order = 0, dataType = TStructGlobal.UINT16, dataLength = 2)
    public long x;

    /**
     * Y坐标
     */
    @TStruct(order = 1, dataType = TStructGlobal.UINT16, dataLength = 2)
    public long y;

    /**
     * 图片区域宽度
     */
    @TStruct(order = 2, dataType = TStructGlobal.UINT16, dataLength = 2)
    public long width;

    /**
     * 图片区域高度
     */
    @TStruct(order = 3, dataType = TStructGlobal.UINT16, dataLength = 2)
    public long height;

    /**
     * 其他设置
     */
    @TStruct(order = 4, dataType = TStructGlobal.UINT64, dataLength = 8)
    public long settings;

    /**
     * 图片内容 (最大100k)
     */
    @TStruct(order = 5, dataType = TStructGlobal.UINT8, arrayLength = 1024 * 100)
    public byte[] image = new byte[1024 * 100];


    @TStruct(order = 6, dataType = TStructGlobal.UINT64, dataLength = 8)
    public long orderIndex;

    @Override
    public int getSize() {
        return 2 * 4 + 8 + 1024 * 100 + 8; // 102424
    }
}

package com.xxx.modules.cmp.cmp.dto;

import lombok.Data;

import java.util.List;

/**
 * @author yws
 * @BelongsProject: xxx-platform
 * @BelongsPackage: com.xxx.modules.cmp.dto
 * @CreateTime: 2022-11-28 11:18
 * @Description: 名牌模板DTO
 */
@Data
public class NameplateTemplateDataDTO {

    /**
     * 制造商 2022 11 13  yws
     */
    private String manufacturer;


    /**
     * 文件类型 2022 11 13  yws
     */
    private String fileType;


    /**
     * 名称 2022 11 13  yws
     */
    private String name;

    /**
     * 版本 2022 11 13  yws
     */
    private String version;


    /**
     * 背景色 2022 11 13  yws
     */
    private Long backGround;


    /**
     * 分辨率类型 0: 1200 * 232  1: 640 * 384  2: 1904 * 464
     */
    private Integer resolution;

    /**
     * 是否反色
     */
    private Integer revert;

    /**
     * 文本内容
     */
    private List<NameplateTextDataDTO> textData;

    /**
     * 图片内容
     */
    private List<NameplateImageDataDTO> imageData;


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Owen_Number_One

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值