【】生成文件MD5图像,类似于GitHub的像素风格头像

这篇具有很好参考价值的文章主要介绍了【】生成文件MD5图像,类似于GitHub的像素风格头像。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

我想通过文件的md5生成关于这个md5的图像,类似于GitHub的随机像素头像,用处是让这个md5更加直观,也能用于生成各种用户头像,跟GitHub一样。

网上搜了一下,没有现成的方法,只能有一篇类似的文章可以借鉴一下,但是那篇是随机的字符串,而我的是文件,是固定的字符串,且不要改变列的数量,那我以此为基础,改一下就行了。

参考的内容:实现类似于Github的随机形状、随机颜色 像素风格头像_github像素头像_LLH_Durian的博客-CSDN博客

算法原理

由于md5是一个32位字符组成的字符串,那就可以再次上面大做文章了,我的计算方式为:

0~9位取平均值作为r(red),10~19位取平均值作为g(green),20~31位取平均值作为b(blue),那么头像的颜色就已经决定下来了。

接下来就是确定图像的像素数量,经过我的深思熟虑后,最终确定下来为8*16,即一共有8列像素,每列16行,由于头像是对称的,因此镜像一下,就是16*16的一张图片。

也就是如图所示的情况:

【】生成文件MD5图像,类似于GitHub的像素风格头像

由于4个十六进制字符串正好是二进制的16位长度,正好可以铺满一列,我这边将1填充,0不填充,然后图片就能由此绘制出来了。

代码实现

代码有点长,不过很多都是注释,需要引入Hutool即可运行

package com.itdct.md5pic;

import org.apache.commons.lang3.StringUtils;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.nio.charset.Charset;

import javax.imageio.ImageIO;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.HexUtil;
import cn.hutool.crypto.digest.MD5;

/**
 * @author DCTANT
 * @version 1.0
 * @date 2023/4/28 15:55:23
 * @description 用于生成文件MD5图片的方法
 */
public class GenerateMd5Pic {
    private MD5 md5 = new MD5();
    /**
     * 每个格子占据的像素大小
     */
    private int blockSize = 250;
    /**
     * 内边距,默认为两倍的格子宽度
     */
    private int padding = blockSize * 2;
    /**
     * 背景颜色,默认为白色
     */
    private Color backgroundColor = new Color(255, 255, 255);
    /**
     * 输出路径
     */
    private String outputPath;
    /**
     * 输入文件路径
     */
    private String filePath;
    /**
     * 是否输出md5文件
     */
    private boolean writeMd5File;

    /**
     * 通过32位长度的字符串生成图片
     *
     * @param hexString
     */
    public void string32Img(String hexString) {
        if (hexString.length() != 32) {
            throw new RuntimeException("输入字符串参数长度不是32");
        }

        // INFO: DCTANT: 2023/4/28 取RGB的总值
        String redTotal = hexString.substring(0, 10);
        String greenTotal = hexString.substring(10, 20);
        String blueTotal = hexString.substring(20, 32);

        // INFO: DCTANT: 2023/4/28 获取到平均后的rgb的值
        int r = getAverage256Value(redTotal);
        int g = getAverage256Value(greenTotal);
        int b = getAverage256Value(blueTotal);
        // INFO: DCTANT: 2023/4/28 定义每个格子的颜色
        Color blockColor = new Color(r, g, b);

        // INFO: DCTANT: 2023/4/28 计算图片的总像素宽度
        int picSize = 2 * padding + blockSize * 16;

        BufferedImage bufferedImage = new BufferedImage(picSize, picSize, BufferedImage.TYPE_INT_RGB);

        // INFO: DCTANT: 2023/4/28 获取图片画笔
        Graphics2D graphics2D = (Graphics2D) bufferedImage.getGraphics();
        // INFO: DCTANT: 2023/4/28 设置背景颜色
        graphics2D.setColor(backgroundColor);
        // INFO: DCTANT: 2023/4/28 画出整个背景
        graphics2D.fillRect(0, 0, picSize, picSize);

        boolean[][] blockArray = calculateBlockArray(hexString);

        graphics2D.setColor(blockColor);
        // INFO: DCTANT: 2023/4/28 绘制每个格子 
        for (int column = 0; column < blockArray.length; column++) {
            boolean[] rows = blockArray[column];
            for (int row = 0; row < rows.length; row++) {
                boolean isBlock = rows[row];
                if (!isBlock) {
                    continue;
                }
                // INFO: DCTANT: 2023/4/28 数值为1的,画出方格
                int x = padding + column * blockSize;
                int y = padding + row * blockSize;
                graphics2D.fillRect(x, y, blockSize, blockSize);
            }
        }

        if (StringUtils.isBlank(outputPath)) {
            if (StringUtils.isBlank(filePath)) {
                outputPath = "./" + hexString + ".jpg";
            } else {
                outputPath = filePath + ".md5.jpg";
            }
        }

        try {
            File file = new File(outputPath);
            System.out.println("输出路径为:" + file.getAbsolutePath());
            ImageIO.write(bufferedImage, "JPG", new FileOutputStream(outputPath));//保存图片 JPEG表示保存格式
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 通过十六进制字符串,计算出16*16的像素数组
     *
     * @param hexString
     * @return
     */
    private boolean[][] calculateBlockArray(String hexString) {
        boolean[][] blockArray = new boolean[16][16];
        for (int column = 0; column < 8; column++) {
            // INFO: DCTANT: 2023/4/28 将32位的md5,每4位切一个下来
            String fourHexString = hexString.substring(column * 4, (column + 1) * 4);
            // INFO: DCTANT: 2023/4/28 转为十进制
            int decimal = HexUtil.hexToInt(fourHexString);
            // INFO: DCTANT: 2023/4/28 十进制转二进制
            StringBuilder binaryBuilder = new StringBuilder(Integer.toBinaryString(decimal));
            // INFO: DCTANT: 2023/4/28 补零
            if (binaryBuilder.length() < 16) {
                int addZeroCount = 16 - binaryBuilder.length();
                for (int i = 0; i < addZeroCount; i++) {
                    binaryBuilder.insert(0, "0");
                }
            }

            // INFO: DCTANT: 2023/4/28 转为字符数组,用于判断是0还是1
            char[] chars = binaryBuilder.toString().toCharArray();
            for (int row = 0; row < chars.length; row++) {
                char theOneOrZero = chars[row];
                if (theOneOrZero == '1') {
                    blockArray[column][row] = true;
                    // INFO: DCTANT: 2023/4/28 对称点赋值
                    blockArray[15 - column][row] = true;
                } else {
                    blockArray[column][row] = false;
                    // INFO: DCTANT: 2023/4/28 对称点赋值
                    blockArray[15 - column][row] = false;
                }
            }
        }
        return blockArray;
    }

    /**
     * 通过文件生成其MD5图像
     *
     * @param filePath
     */
    public void fileImg(String filePath) {
        File file = new File(filePath);
        if (!file.exists()) {
            throw new RuntimeException("文件不存在");
        }

        String md5String = md5.digestHex(filePath);
        System.out.println("file md5 is " + md5String);
        if (writeMd5File) {
            FileUtil.writeString(md5String, filePath + ".md5", Charset.defaultCharset());
        }
        this.filePath = filePath;
        string32Img(md5String);
    }

    /**
     * 计算整个十六进制字符串的其中两位的平均值,并四舍五入
     *
     * @param hex 该十六进制字符串每两位的平均值
     * @return
     */
    public int getAverage256Value(String hex) {
        int loopCount = hex.length() / 2;
        if (hex.length() % 2 == 1) {
            throw new RuntimeException("hex长度必须为偶数");
        }
        double total = 0.0;
        for (int i = 0; i < loopCount; i++) {
            String twoHex = hex.substring(i * 2, (i + 1) * 2);
            int value = HexUtil.hexToInt(twoHex);
            total += value;
        }
        double value = total / loopCount;
        int result = new BigDecimal(value).setScale(0, RoundingMode.HALF_UP).intValue();
        return result;

    }

    public static void main(String[] args) {
        GenerateMd5Pic generateMd5Pic = new GenerateMd5Pic().setWriteMd5File(true);
        generateMd5Pic.fileImg("C:\\Tmp\test\\jenkins.war");
    }

    public String getFilePath() {
        return filePath;
    }

    public GenerateMd5Pic setFilePath(String filePath) {
        this.filePath = filePath;
        return this;
    }

    public int getBlockSize() {
        return blockSize;
    }

    public GenerateMd5Pic setBlockSize(int blockSize) {
        this.blockSize = blockSize;
        return this;
    }

    public int getPadding() {
        return padding;
    }

    public GenerateMd5Pic setPadding(int padding) {
        this.padding = padding;
        return this;
    }

    public String getOutputPath() {
        return outputPath;
    }

    public GenerateMd5Pic setOutputPath(String outputPath) {
        this.outputPath = outputPath;
        return this;
    }

    public GenerateMd5Pic setBackgroundColor(Color backgroundColor) {
        this.backgroundColor = backgroundColor;
        return this;
    }

    public boolean isWriteMd5File() {
        return writeMd5File;
    }

    public GenerateMd5Pic setWriteMd5File(boolean writeMd5File) {
        this.writeMd5File = writeMd5File;
        return this;
    }
}

实现结果

我就拿Jenkins的war包来举例吧,生成的效果如下:

【】生成文件MD5图像,类似于GitHub的像素风格头像

如果你的Jenkins和我同一个版本的话,那么生成的图片应该是一模一样的,当然这个也可以用作头像

【】生成文件MD5图像,类似于GitHub的像素风格头像

 文章来源地址https://www.toymoban.com/news/detail-428731.html

 

到了这里,关于【】生成文件MD5图像,类似于GitHub的像素风格头像的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 安卓生成公钥和md5签名

    大家好,最近需要备案app,用到了公钥和md5,MD5签名我倒是知道,然而对于公钥却一下子不知道了, 现在我讲一下我的流程。 首先是md5证书签名的查看, 生成了apk和签名.jks后,就是查看Md5了,如下如 输入密码后,敲击回车键,就会生成md5和 sha1的数据,对于md5签名,需要去

    2024年02月08日
    浏览(43)
  • Linux文件MD5校验

    1. 进入操作系统Linux中的/root目录,找到test.txt文件,并使用md5sum工具来计算出该文件的md5值,并将计算该文件md5的命令的字符串作为flag进行提交;   Flag :md5sum test.txt   2. 进入操作系统Linux中的/root目录,找到test.txt文件,并使用md5sum校验工具来计算出该文件的md5值,并将计

    2024年02月08日
    浏览(54)
  • 【系统】查看文件的md5值

    查看md5可以确认文件是否被篡改或者是否下载完成,网上有很多小工具,但实际上系统自带的命令也能查看。 1.Windows系统 Windows系统自带有certutil命令里面包含了查看文件哈希的命令,可以在cmd窗口执行certutil命令 2.Linux系统 Linux系统也有自带的获取文件md5的命令,可以在终端

    2024年02月15日
    浏览(41)
  • Java关于MD5文件校验

    JAVA中获取文件MD5值的四种方法其实都很类似,因为核心都是通过JAVA自带的MessageDigest类来实现。获取文件MD5值主要分为三个步骤,第一步获取文件的byte信息,第二步通过MessageDigest类进行MD5加密,第三步转换成16进制的MD5码值。 MD5讯息摘要演算法(英语:MD5 Message-Digest Algori

    2024年02月08日
    浏览(45)
  • java获取文件md5值

    给客户交付的文件,客户需要验证md5值,客户java语言,记录下实现过程,很简单。 请替换 path/to/your/file.txt 为你实际文件的路径。这个 Java 代码会读取文件内容并生成相应的 MD5 值。

    2024年01月17日
    浏览(42)
  • Java获取文件的MD5

    主要是通过读取文件的字符流,然后赋值给MessageDigest对象,最后将文件流转换成16进制的字符串。

    2024年02月16日
    浏览(41)
  • 文件传输中的MD5校验技术

      1. 文件的MD5校验简介   文件的MD5校验是一种常用的文件完整性验证方法。MD5(Message Digest Algorithm 5)是一种广泛应用的哈希算法,它能够将任意长度的数据转换为固定长度的哈希值。在文件校验中,MD5算法通过计算文件的哈希值,将文件内容转化为唯一的128位(16字节)哈

    2024年01月22日
    浏览(46)
  • 文件完整性校验之MD5校验

    文件完整性校验之MD5校验 在现代计算机系统中,文件安全和完整性保护是至关重要的。不仅是个人用户需要保护他们的数据免受恶意软件和黑客攻击,企业和机构也需要确保其敏感数据的完整性和机密性。 MD5校验是一种广泛使用的校验技术,可以帮助用户验证文件是否经过

    2024年02月06日
    浏览(53)
  • js:spark-md5分片计算文件的md5值

    SparkMD5 is a fast md5 implementation of the MD5 algorithm. 文档 https://github.com/satazor/js-spark-md5 https://www.npmjs.com/package/spark-md5 CDN引入 npm安装 使用方式一: 使用方式二: 计算文件md5值 分片读取文件,并计算md5值 参考 spark.md5.js获取文件的md5值

    2024年02月06日
    浏览(47)
  • 安卓keytool获取不到签名文件的MD5

    目前通过 keytool -list -v -keystore xxx.jks 这种方法获取签名的md5时,只能显示SHA1和SHA256,不显示md5: 解决办法: 1.先将自己的keystore配置进app下的build.gradle中: 2.打开AndroidStudio的Gradle,找到Tasks-android-signingReport,双击: 找到Config为release,Alias与你签名文件的别名一致的信息,即可

    2024年02月11日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包