精华内容
下载资源
问答
  • 如何向压缩包内添加图
    2021-10-04 16:39:14

    一、问题场景

    只需对jar中的部分常量进行修改,无源码

    二、适用对象

    1.工程维护的新手,对开发平台、编程语言等了解不多

    2.代码修改量小,多为常量修改

    三、方法步骤

    一、将jar包内容进行解压,得到.class文件

    二、通过idea增加空项目,安装jclasslib插件,导入.class文件

    三、点击.class文件,进行编辑,编辑后输出,得到修改后的.class文件

    四、用压缩软件打开.jar包,进行替换。搞定!

    更多相关内容
  • 简单操作: 解压缩软件打开,添加-》选择-》存储-》选项-》即可-》保存 eg: springBoot.jar lib文件夹添加依赖jar 如: 多数用于数据库驱动缺少依赖的情况下

    简单操作:
    解压缩软件打开,添加-》选择-》存储-》选项-》即可-》保存
    eg:
    springBoot.jar lib文件夹添加依赖jar
    如图:
    在这里插入图片描述

    多数用于数据库驱动缺少依赖的情况下
    
    展开全文
  • 请问怎么通过Java代码,在一个指定的Jar包内添加一个新的文件? (不是使用压缩工具手动拉进去)
  • 负责对图像文件进行压缩添加水印的操作。 需要在pom.xml中引入两个jar: MInio Client sdk和 谷歌的thumbnailator图像处理工具: : <groupId>io.minio <artifactId>minio <version>3.0.10 ...

    在搭建好了MInio分布式对象存储集群后,官方提供了MInio Client 各类语言的SDK,但是无法直接使用需要进一步封装,这里将JAVA 版的的SDK结合自身业务做个简单封装。

    Minio 中文文档入口:https://docs.min.io/cn/minio-quickstart-guide.html

    Minio Clinet SDK文档入口:https://docs.min.io/cn/java-client-api-reference.html

    以下共有俩个工具类,其中MioioUtil负责处理文件的上传及minio的相关初始化,ImageUtil负责对图像文件进行压缩及添加水印的操作。

    需要在pom.xml中引入两个jar包:

    MInio Client sdk包和谷歌的thumbnailator图像处理工具::

    <dependency>
        <groupId>io.minio</groupId>
        <artifactId>minio</artifactId>
        <version>3.0.10</version>
    </dependency>
    
    <dependency>
        <groupId>net.coobird</groupId>
        <artifactId>thumbnailator</artifactId>
        <version>0.4.8</version>
    </dependency>
    
    MinioUtil.class如下:
    import io.minio.MinioClient;
    import io.minio.errors.InvalidEndpointException;
    import io.minio.errors.InvalidPortException;
    import io.minio.policy.PolicyType;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.web.multipart.MultipartFile;
    import javax.imageio.ImageIO;
    import java.io.InputStream;
    import java.time.LocalDate;
    import java.util.Random;
    
    /**
     * 对象存储工具类
     * @author 10552
     */
    public class MinioUtil {
        private static final Logger log = LoggerFactory.getLogger(MinioUtil.class);
        //Mino服务器的AccessKey
        private final transient static String ACCESS_KEY="填写你的Mino服务器AccessKey";
        //Mino服务器的SecretKey
        private final transient static String SECRET_KEY="填写你的Mino服务器SecretKey";
        //桶名称
        private final transient static String BUCKET_NAME="delivery";
        //读写分离-上传服务器
        private final transient static String OSS_URL_WRITE="http://你的服务器上传地址";
        //读写分离-下载服务器
        private final transient static String OOS_URL_READ="http://你的服务器下载地址";
        //minio服务端口,默认是9000
        private final transient static int OSS_PORT=9000;
        private transient static boolean BUCKET_EXISTS=false;
        //单例模式-内部类实现
        private static class MinioClientHolder {
            private static  MinioClient minioClient;
            static {
                try {
                    minioClient = new MinioClient(OSS_URL_WRITE, OSS_PORT,ACCESS_KEY, SECRET_KEY);
                } catch (InvalidEndpointException e) {
                    e.printStackTrace();
                } catch (InvalidPortException e) {
                    e.printStackTrace();
                }
            }
        }
        /**
         * 获取minio客户端实例
         * @return
         */
        private static MinioClient getMinioClient(){
            return MinioClientHolder.minioClient;
        }
    
        /**
         * 上传文件
         * 支持单文件,多文件
         * 返回文件访问路径,多文件以分号‘;’分隔
         * @param muFiles
         * @return
         */
        public static String uploadFiles(MultipartFile... muFiles) {
            if (muFiles.length<1){
                throw new RuntimeException("上传文件为空!");
            }
            StringBuilder str=new StringBuilder();
            for (MultipartFile muFile : muFiles) {
                str.append(uploadFile(muFile));
                str.append(";");
            }
            return str.deleteCharAt(str.length()-1).toString();
    
        }
    
        /**
         * 内部方法
         * 上传文件
         * @param muFile
         * @return
         */
        private static String uploadFile(MultipartFile muFile){
            String fileName = getFilePathName(muFile,false);
            try {
                MinioClient minioClient = getMinioClient();
                if(!BUCKET_EXISTS&&!minioClient.bucketExists(BUCKET_NAME)){
                    minioClient.makeBucket(BUCKET_NAME);
                    minioClient.setBucketPolicy(BUCKET_NAME, "", PolicyType.READ_ONLY);
                    BUCKET_EXISTS=true;
                }
                InputStream inputStream=muFile.getInputStream();
                //如果是图片文件就进行压缩
                if (ImageUtil.isImage(muFile.getOriginalFilename())){
                    inputStream=ImageUtil.getInputStream(
                            ImageUtil.setWatermark(
                                    ImageUtil.compress(
                                            ImageIO.read(inputStream))),
                            ImageUtil.getFileExtention(muFile.getOriginalFilename()));
                }
                minioClient.putObject(BUCKET_NAME, fileName , inputStream,muFile.getContentType());
            }  catch (Exception e) {
                log.error("文件上传失败",e);
                throw new RuntimeException("文件上传失败");
            }
            return OOS_URL_READ+BUCKET_NAME+fileName;
        }
    
        /**
         * 	 获取文件名
         * @param muFile 文件
         * @param isRetain 是否保留源文件名
         * @return 返回文件名,以当前年月日作为前缀路径
         */
        private static String getFilePathName(MultipartFile muFile,boolean isRetain){
            String fileName = muFile.getOriginalFilename();
            String name=fileName;
            String prefix="";
            if(fileName.indexOf('.')!=-1) {
                name=fileName.substring(0,fileName.indexOf('.'));
                prefix=fileName.substring(fileName.lastIndexOf("."));
            }
    
            LocalDate date = LocalDate.now();
            StringBuilder filePathName=new StringBuilder("/upload/");
            filePathName.append(date.getYear());
            filePathName.append("/");
            filePathName.append(date.getMonthValue());
            filePathName.append("/");
            filePathName.append(date.getDayOfMonth());
            filePathName.append("/");
            //添加随机后缀
            Random r = new Random();
            int pix=r.ints(1, (100 + 1)).findFirst().getAsInt();
            filePathName.append(System.currentTimeMillis());
            filePathName.append(""+pix);
            //文件名超过32字符则截取
            if(isRetain){
                filePathName.append("_");
                if(name.length()>=32){
                    name=name.substring(0,32);
                }
                filePathName.append(name);
            }
            filePathName.append(prefix);
            return filePathName.toString();
        }

    ImageUtil.class工具类如下:

    import net.coobird.thumbnailator.Thumbnails;
    import net.coobird.thumbnailator.geometry.Positions;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import javax.imageio.ImageIO;
    import java.awt.*;
    import java.awt.font.FontRenderContext;
    import java.awt.font.TextAttribute;
    import java.awt.geom.AffineTransform;
    import java.awt.geom.Rectangle2D;
    import java.awt.image.BufferedImage;
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.text.AttributedCharacterIterator;
    import java.text.AttributedString;
    
    /**
     * 图像工具类
     */
    public class ImageUtil {
        private static final Logger log = LoggerFactory.getLogger(ImageUtil.class);
        //压缩率
        private static final transient  float IMAGE_RATIO=0.1f;
        //压缩最大宽度
        private static final transient  int IMAGE_WIDTH=800;
        // 水印透明度
        private static float alpha = 0.3f;
        // 水印文字字体
        private static Font font = new Font("PingFang SC Regular", Font.PLAIN, 36);
        // 水印文字颜色
        private static Color color = new Color(111, 111, 111);
        //水印文字内容
        private static final String text="这是一个水印文本";
        // 水印之间的间隔
        private static final int XMOVE = 80;
        // 水印之间的间隔
        private static final int YMOVE = 80;
    
        /**
         * 压缩图像
         * @param image
         * @return
         * @throws IOException
         */
        public static BufferedImage compress(BufferedImage image) throws IOException {
            Thumbnails.Builder<BufferedImage> imageBuilder= Thumbnails.of(image).outputQuality(IMAGE_RATIO);
            if(image.getWidth()>IMAGE_WIDTH){
                return imageBuilder.width(IMAGE_WIDTH).asBufferedImage();
            }
            else {
                return imageBuilder.scale(1).asBufferedImage();
            }
        }
    
        /**
         * 图像添加水印
         * @param
         * @return
         */
        public static BufferedImage setWatermark(BufferedImage image)throws IOException {
            return Thumbnails.of(image)
                    .outputQuality(IMAGE_RATIO)
                    .scale(1)
                    .watermark(Positions.BOTTOM_RIGHT
                            ,createWatermark(text
                                    ,image.getWidth()
                                    ,image.getHeight()
                            )
                            ,alpha)
                    .asBufferedImage();
        }
        /**
         * 根据文件扩展名判断文件是否图片格式
         * @return
         */
        public static boolean isImage(String fileName) {
            String[] imageExtension = new String[]{"jpeg", "jpg", "gif", "bmp", "png"};
    
            for (String e : imageExtension) if (getFileExtention(fileName).toLowerCase().equals(e)) return true;
    
            return false;
        }
    
        /**
         * 获取文件后缀名称
         * @param fileName
         * @return
         */
        public static String getFileExtention(String fileName) {
            String extension = fileName.substring(fileName.lastIndexOf(".") + 1);
            return extension;
        }
        /**
         * 根据图片对象获取对应InputStream
         *
         * @param image
         * @param readImageFormat
         * @return
         * @throws IOException
         */
        public static InputStream getInputStream(BufferedImage image, String readImageFormat) throws IOException
        {
            ByteArrayOutputStream os = new ByteArrayOutputStream();
            ImageIO.write(image, readImageFormat, os);
            InputStream is = new ByteArrayInputStream(os.toByteArray());
            os.close();
            return is;
        }
        /**
         * 创建水印图片
         * @param text 水印文字
         * @param width 图片宽
         * @param height 图片高
         * @return
         */
        public static BufferedImage createWatermark(String text,int width,int height)  {
            BufferedImage image = new BufferedImage(width
                    , height, BufferedImage.TYPE_INT_RGB);
            // 2.获取图片画笔
            Graphics2D g = image.createGraphics();
            // ----------  增加下面的代码使得背景透明  -----------------
            image = g.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);
            g.dispose();
            g = image.createGraphics();
            // ----------  背景透明代码结束  -----------------
            // 6、处理文字
            AttributedString ats = new AttributedString(text);
            ats.addAttribute(TextAttribute.FONT, font, 0, text.length());
            AttributedCharacterIterator iter = ats.getIterator();
            // 7、设置对线段的锯齿状边缘处理
            g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            // 8、设置水印旋转
            g.rotate(Math.toRadians(-30));
            // 9、设置水印文字颜色
            g.setColor(color);
            // 10、设置水印文字Font
            g.setFont(font);
            // 11、设置水印文字透明度
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
            /**
             * 水印铺满图片
             * 计算水印位置
             */
            int x = -width / 2;
            int y = -height / 2;
            int[] arr = getWidthAndHeight(text, font);
            int markWidth = arr[0];// 字体长度
            int markHeight = arr[1];// 字体高度
            // 循环添加水印
            while (x < width * 1.5) {
                y = -height / 2;
                while (y < height * 1.5) {
                    g.drawString (text, x, y);
    
                    y += markHeight + YMOVE;
                }
                x += markWidth + XMOVE;
            }
            // 13、释放资源
            g.dispose();
            return image;
        }
    
        /**
         * 计算字体宽度及高度
         * @param text
         * @param font
         * @return
         */
        private static int[] getWidthAndHeight(String text, Font font) {
            Rectangle2D r = font.getStringBounds(text, new FontRenderContext(
                    AffineTransform.getScaleInstance(1, 1), false, false));
            int unitHeight = (int) Math.floor(r.getHeight());//
            // 获取整个str用了font样式的宽度这里用四舍五入后+1保证宽度绝对能容纳这个字符串作为图片的宽度
            int width = (int) Math.round(r.getWidth()) + 1;
            // 把单个字符的高度+3保证高度绝对能容纳字符串作为图片的高度
            int height = unitHeight + 3;
            return new int[]{width, height};
        }

     

     

    展开全文
  • 网上有很多文章要添加jar依赖 例如: https://blog.csdn.net/u013241093/article/details/82526097 https://www.cnblogs.com/stono/p/6736329.html 在JDK8之前java自带的ZipOutputStream方法确实没有解决该乱码...
    import java.util.zip.ZipOutputStream;
    import java.io.FileOutputStream;
    import java.nio.charset.Charset;
    
    FileOutputStream fos = new FileOutputStream("src/main/resources/dirCompressed.zip");
    
    // ❗❗❗指定编码可以避免因为环境配置的问题导致的文件名乱码
    ZipOutputStream zipOut = new ZipOutputStream(fos, Charset.forName("utf-8"));
    

    网上有很多文章要添加jar包依赖
    例如:

    • https://blog.csdn.net/u013241093/article/details/82526097
    • https://www.cnblogs.com/stono/p/6736329.html

    在JDK8之前java自带的ZipOutputStream方法确实没有解决该乱码问题,
    之后可以通过java原生的ZipOutputStream指定编码格式来解决乱码问题.

    展开全文
  • linux下tar追加与其他压缩追加方式

    千次阅读 2021-12-02 09:52:47
    如果有一个 zhidao.tar.bz2 ,需要把baidu.txt追加进去,就用命令: 1 tar-rvfzhidao.tar.bz2baidu.txt 从tarzhidao.tar.bz2中取出file2.txt则用: 1 2 tar-...
  • Android打包混淆压缩

    千次阅读 2017-04-28 18:26:43
    声明这篇文章,借鉴参考了下面的两篇文章,算是一个自己对混淆这块的总结。 写给Android开发者的混淆使用手册 Android混淆打包那些事儿混淆简介说到混淆,就要说到proGuard,...如上所示,混淆过程会有如下几个功能
  • 项目中,有提供照片上传的功能,现在用户需要导出图片,但需要在照片底部添加用户名和编号,基本参考有一篇博文:可以使用java内置的图形工具,建立画布,将图片绘制在画布上,然后在底部添加文字,工具类如下: package test;...
  • 我们都知道直接用Unity打Apk的时候会把StreamingAssets目录下的资源拷贝到assets目录下进行打包,资源是不会被压缩的,但是如果我们是导出AS工程出的话,我们会发现进游戏会明显的卡顿,排查后发现原因就是用AS...
  • 1、使用压缩软件,解压平台提供的yusp-app-oca.jar,解压后的目录格式如下: yusp-app-oca ...BOOT-INF\* ...META-INF\* ...org\* 2、在yusp-app-oca\BOOT-INF\lib目录中添加mysql驱动 3、进入yusp-app-oca目录,...
  • Node.js之archiver压缩打包文件或目录为zip格式
  • 很多情况下,需求上对某个图片进行压缩或者添加水印,我们都会使用到这些图片处理的工具。在大多工具中,hutool无非是最好用的。 依赖 <dependency> <groupId>cn.hutool</groupId> <...
  • iOS之性能优化·内置图片瘦身

    万次阅读 2021-10-18 20:44:46
    一、iOS 内置资源的集中方式 ① 将图片存放在 bundle 将图片存放在 bundle,是一种很...iOS 系统不会对其进行压缩存储,造成了应用体积的增大; 使用 bundle 存储图片放弃了 APP thinning。明显的表现是 2 倍屏
  • UnityPC端打包exe,压缩为一个exe文件
  • 首先我们打开「我的ABC软件工具箱」,进入到文件夹转成压缩包的功能,如下: 在这里我们需要添加批量打包成 ZIP 和 7z 压缩包的文件夹: 当我们添加完需要批量转换为 ZIP 和 7z 压缩包格式的文件夹之后,直接单击...
  • 6.5 zip压缩工具前面的三个命令都不支持压缩目录,但是zip支持:首先压缩文件[root@localhost gzip]# yum -y install zip[root@localhost gzip]# zip b.txt.zip b.txtadding: b.txt (deflated 74%)[root@localhost ...
  • python压缩文件夹所有文件为zip文件的方法本文实例讲述了python压缩文件夹所有文件为zip文件的方法。分享给大家供大家参考。具体如下:用这段代码可以用来打包自己的文件夹为zip,我就用这段代码来备份import ...
  • 利用tar,可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者档案中加入新的文件。tar最初被用来在磁带上创建档案,现在,用户可以在任何设备上创建档案。利用tar命令,可以把一大堆的文件和...
  • 先上效果效果如下压缩质量还不错,4.37M到550k 压缩率更是达到了87% ,这省了不少流量和服务器硬盘啊,哈哈 1.组件html定义了图片上传增加按钮,将原有的input标签样式进行了更改,图片显示也进行样式更改,利用...
  • 用360压缩打开,桌rar软件打开jar,不要解压打开。将需要添加的文件直接拖入里面即可。 如果先解压,把内容放进去jar后,再压缩回去,jar会加载失败,感觉像是里面文件格式已经被损坏。
  • 基于Plupload的图片压缩上传

    千次阅读 2018-03-01 00:20:58
    为什么要做图片压缩? 现在手机拍照都快10M了,但是有时候图片上传只要看得清楚就可以了,比如上传身份证200k能看清楚,为什么要上传20M?这样做的好处是减少服务器存储压力、减少带宽占用。 为什么要自己做一个...
  • 上次写了图片压缩,这倒让我想起几年前看过的一个很有意思的东西 那就是这张鸭子: 不过微信会压缩图片,你可以打开这个链接:...
  • Linux压缩和打包

    千次阅读 多人点赞 2020-04-01 09:33:02
    压缩命令:zip、gzip、bzip2、xz 打包命令:tar
  • 打包 压缩 命令tar zip

    千次阅读 2019-01-10 09:41:00
    这里添加了一个参数用于设置压缩级别 -[1-9] ,1表示最快压缩但体积大,9表示体积最小但耗时最久。 最后那个 -x 是为了排除我们上一次创建的 zip 文件,否则又会被打包进这一次的压缩文件中, 注意:这里只能使用...
  • 打好的JAR改配置文件一直挺烦。之前是用好压打开压缩包内部修改文件,特别不方便。 SpringBoot的jar不是常规的jar文件,其中包含着一些自启动的shell脚本,用jar进行重新... 解压缩jar 在当前目录下新建...
  • 图像压缩之算术编码

    万次阅读 2019-04-15 10:43:15
    JPEG中使用了量化、哈夫曼编码等,极大的压缩图片占用的空间,那么是否可以进一步压缩呢? 从技术角度讲,是可以的。如DropBox开源的lepton,在目前的JPEG压缩基础上,可以再节省22%左右的空间。 lepton中使用算术...
  • 掌握JS压缩图片,这一篇就够了

    千次阅读 2020-08-18 10:23:41
    本文将试图解决如下问题:弄清 Image 对象、data URL、Canvas 和 File(Blob)之间的转化关系;图片压缩关键技巧;超大图片压缩黑屏问题。
  • 1、报错原因使用java.util.zip进行压缩文件时,压缩包的文件的文件名乱码,以下是部分代码//导入的import java.util.zip.ZipEntry;import java.util.zip.ZipOutputStream; //生成压缩包,将文件写入到压缩包 ...
  • vue3+vite项目的 vite打包配置,包含静态资源拆分打包\超大静态资源拆分\静态资源压缩\去除console和debugger\旧版chorme和ie兼容\ENV配置等内容,持续更新中
  • 压缩文件命令

    千次阅读 2022-03-14 20:17:17
    压缩文件命令 一、简单压缩命令 1.zip、gizp、xz只能对文件进行压缩,不能对文件夹,而且直接在文件上进行操作,后缀名为.gz [root@xiaoliu junhao]# gzip passwd [root@xiaoliu junhao]# ls cali junhao.txt ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 259,573
精华内容 103,829
关键字:

如何向压缩包内添加图