分享一个使用Java工具类——git格式图片裁剪重组

news2024/11/24 13:00:02

git格式图片裁剪重组

有时候需要自己录制一个gif图片的时候就不知道去哪里录制,所以只能在百度找一个可以录制gif图片的软件,但是你会发现,你能找到的免费导出的都是有水印的,所以你可能就需要找一个水印少一点的软件了,但是gif又不像是图片水印再少你也没办法直接去处理,但是你要的gif格式的图片肯定是不想有水印的,所以我就想一个办法,通过代码去处理!!

有钱人的话直接买会员的可以过了!

找一个方便处理的录制软件

其实需求都是自己遇到的哈!!

既然用代码处理,那么就肯定想这一个方便处理的,这里我就找了一个水印不在中间的,那不在中间的水印我就可以裁剪的方式把水印去掉,保留中间部分我需要的图片,这里我就找到了一个水印在左上和右下的录制软件,如下图:
在这里插入图片描述

上面的图片就是我截取的gif中的一张图,可以看到左上和右下是有水印的(这里我打码了),那么这种的水印我们就很方便去处理了

裁剪gif

通过下载的软件录制成上面的带有水印的gif图片,作为一个程序员,这种的处理方案应该算是很简单的一种了,至少一看到这样的我就想到用裁剪的方式,那裁剪我自己第一步是百度找站长工具在线裁剪,结果找的都是裁剪完带上了自己免费的裁剪工具的水印logo,所以根本满足不了自己的需求!那作为一个程序员总不能就这样放弃了!

所以果断找代码通过代码的方式去裁剪,因为裁剪的方式直接从左上角裁剪一定的范围就能满足需求了!

思路:
本来以为有直接的裁剪工具,但是网上找了一段时间要么不能运行,要么使用的库是自己封装的别人无法使用!!但是都是基于gif处理的!

所以最后的方案为:将gif的每一帧获取到,将每一帧读取为一张图片,然后通过裁剪每一帧的图片,将裁剪完的图片数组重新组成gif,这样得到的新的gif就是我们需要的了!!

这里我用的java写的代码:

读取原来的gif


	File file = new File("D:/demo.gif");
	ImageReader imageReader = ImageIO.getImageReadersByFormatName("gif").next();
	imageReader.setInput(ImageIO.createImageInputStream(file));

使用AnimatedGifEncoder类创建一个新的gif对象,并设置相关属性

   AnimatedGifEncoder encoder = new AnimatedGifEncoder();
   encoder.start("D:/y.gif");
   encoder.setDelay(0);
   encoder.setRepeat(-1);
   encoder.setFrameRate(60);
   encoder.setQuality(1);

循环原来的gif的每一帧,生成图片,将生成的图片加入到创建的新的gif对象中


       for(int i=0;i<imageReader.getNumImages(true);i++){
      
           BufferedImage img = imageReader.read(i);

           int x = 150; // 裁剪开始x坐标
           int y = 80; // 裁剪开始y坐标
           int width = 650; // 裁剪宽度
           int height = 500; // 裁剪高度

           BufferedImage cropped = img.getSubimage(x, y, width, height);
           encoder.addFrame(cropped);
       }
            // 完成编码操作,生成GIF文件
            encoder.finish();
            // 释放ImageReader资源
            imageReader.dispose();

关闭资源之后就能看到新生成的gif图片了,以下为新生成的gif截的一张图

在这里插入图片描述
水印完全处理成功!!!

完整代码

import com.madgag.gif.fmsware.AnimatedGifEncoder;

import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class GifCrop {
    public static void main(String[] args) {
        try {
            // 创建一个指向指定GIF文件的File对象
            // 读取GIF文件
            File file = new File("D:/demo.gif");

            // 使用GIF格式的ImageReader从文件读取图像
            ImageReader imageReader = ImageIO.getImageReadersByFormatName("gif").next();
            // 设置ImageReader的输入为指定的文件
            imageReader.setInput(ImageIO.createImageInputStream(file));

            // 创建一个AnimatedGifEncoder对象,用于将图像帧编码为GIF动画
            AnimatedGifEncoder encoder = new AnimatedGifEncoder();
            // 指定输出的GIF文件路径
            encoder.start("D:/y.gif");

            // 设置每帧的延迟时间,单位为毫秒。这里设置为0,表示每帧立即显示
            encoder.setDelay(0);

            // 设置动画重复次数  -1表示无限次 (这里有一个问题  我上传到CSDN的处理后的gif动画如果设置为-1或者不设置都只执行一次!!!所以我上传CSDN的时候设置很大)
            encoder.setRepeat(-1);

            // 设置动画的帧速率,范围是0.01至100。这里设置为60,表示每秒显示60帧
            encoder.setFrameRate(60);

            // 设置动画颜色质量
            encoder.setQuality(1);

            // 开始读取图像帧,循环直到读取完所有帧  imageReader.getNumImages获取当前gif的帧数
            for(int i=0;i<imageReader.getNumImages(true);i++){
                // 从ImageReader读取帧图像
                BufferedImage img = imageReader.read(i);

                // 定义裁剪区域,这里将图像裁剪为150x80到800x500的区域
                // 获取裁剪区域
                int x = 150; // 裁剪开始x坐标
                int y = 80; // 裁剪开始y坐标
                int width = 650; // 裁剪宽度
                int height = 500; // 裁剪高度

                // 对当前帧图像进行裁剪
                // 裁剪图像
                BufferedImage cropped = img.getSubimage(x, y, width, height);
                // 将裁剪后的图像帧添加到AnimatedGifEncoder中
                encoder.addFrame(cropped);
            }

            // 完成编码操作,生成GIF文件
            encoder.finish();

            // 释放ImageReader资源
            imageReader.dispose();
        } catch (IOException e) {
            // 处理IO异常,打印异常堆栈信息
            e.printStackTrace();
        }
    }
}

Tips:

这里我是处理的gif来上传博客的,但是有一个问题没有解决(代码中也有提到),encoder.setRepeat(-1)这个方法设置-1在本地打开没有问题,但是上传到CSDN博客gif只播放了一次,正确的结果应该是播放无数次!!这个问题我自己没有解决,但是我设置了encoder.setRepeat(5000);,设置播放5000次其实够满足我自己的需求了,所以就没有去处理这个问题了,等回头有时间继续处理!!如果有懂的大佬也可以告知一下!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/879478.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI黑马挑战赛,探索研发新趋势丨IDCF

随着AI的出现&#xff0c;获取知识的成本大幅降低&#xff0c;当DevOps与AI相结合时&#xff0c;必将产生全新的化学反应。不断涌现的AI新工具提醒我们&#xff0c;一个全新的研发工作范式正在逐渐形成。而DevOps的核心理念是敏捷协同&#xff0c;作为工程师&#xff0c;如何通…

印度通过《2023年数字个人数据保护法案》

2023年8月7日&#xff0c;印度议会下议院&#xff08;Lok Sabha&#xff09;通过《2023年数字个人数据保护法案》&#xff08;Digital Personal Data Protection Bill 2023&#xff09;。8月9日&#xff0c;该法案获得上议院&#xff08;Rajya Sabha&#xff09;批准。 - 该法案…

Leaflet入门,Leaflet如何实现vue双向绑定数据添加到图片标记物到地图上,动态根据vue数据更新到地图上以及鼠标经过标记物显示提示框

前言 本章使用Leaflet的vue2-leaflet或者vue-leaflet插件方式实现vue数据绑定地图数据,实现地图标记物与vue数据的双向联动更新,以及鼠标经过标记物显示提示框功能。 实现效果演示 vue如何使用Leaflet vue2如何使用:《Leaflet入门,如何使用vue2-leaflet实现vue2双向绑定…

问题:module was compiled with an incompatible version of kotlin

module was compiled with an incompatible version of kotlin 简要说明 不同模块使用不一致的kotlin版本编译&#xff0c;导致最后merge的时候版本冲突出错了 解决方案 临时解决 build->rebuild project 永久解决 项目不使用kotlin&#xff0c;关闭插件kotlin enable-…

Blazor前后端框架Known-V1.2.12

V1.2.12 Known是基于C#和Blazor开发的前后端分离快速开发框架&#xff0c;开箱即用&#xff0c;跨平台&#xff0c;一处代码&#xff0c;多处运行。 Gitee&#xff1a; https://gitee.com/known/KnownGithub&#xff1a;https://github.com/known/Known 概述 基于C#和Blazo…

山西电力市场日前价格预测【2023-08-15】

日前价格预测 预测明日&#xff08;2023-08-15&#xff09;山西电力市场全天平均日前电价为335.15元/MWh。其中&#xff0c;最高日前电价为390.18元/MWh&#xff0c;预计出现在19: 30。最低日前电价为296.13元/MWh&#xff0c;预计出现在13: 00。 价差方向预测 1&#xff1a; 实…

探秘未知:Unknome数据库揭示人体内未探索的基因和蛋白质奥秘

图片来源&#xff1a;RICHARD JONES/SCIENCE PHOTO LIBRARY/GETTY IMAGES 当我们谈论广阔且未被充分探索的领域时&#xff0c;往往会想到宇宙和地球的深海。然而&#xff0c;就在我们自身的人体内&#xff0c;仍有许多未知领域等待我们去探索。"Unknome"&#xff0c;…

见微知著: StringUtils.split

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《EffectiveJava》独家解析》专栏作者。 热门文章推荐&#xff1a; &#xff08;1&#xff0…

OpenAI 或于 2024 年底破产?外媒也这么爱标题党

“ OpenAI是否走向破产&#xff1f;外媒标题炒作的典型&#xff0c;细看财务实况才能了解真相。” 01 — 今天看到有文章说 OpenAI 正在以迅猛的烧钱的速度前进&#xff0c;可能在2024年底底前面临破产。翻了一下&#xff0c;源于外媒一些报道&#xff1a; 《OpenAI may go ban…

Ubuntu-Server 22.04安装详细过程-图文版

一.下载Ubuntu Server镜像&#xff0c;官方地址下载即可 https://ubuntu.com/download/server 乌班图镜像网址&#xff0c;点击下载即可 二.安装乌班图镜像&#xff0c;最好自己准备u盘在ISO软件内制作完成 1.选择 Install Ubuntu Server 2.选择安装语言为英语 3.安装程序更新选…

【数据结构与算法——TypeScript】图结构(Graph)

【数据结构与算法——TypeScript】 图结构(Graph) 认识图结构以及特性 什么是图? 在计算机程序设计中&#xff0c;图结构 也是一种非常常见的数据结构。 但是&#xff0c;图论其实是一个非常大的话题 认识一下关于图的一些内容 图的抽象数据类型一些算法实现。 什么是图?…

C# OpenCvSharp 颜色反转

效果 灰度图 黑白色反转 彩色反转 项目 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using OpenCvSharp; using Ope…

Docker部署ES服务,全量同步的时候内存爆炸,ES自动关闭,CPU100%

问题 使用canal-adapter全量同步&#xff08;参考Canal Adapter1.1.5版本API操作服务&#xff0c;手动同步数据&#xff08;4&#xff09;&#xff09;的时候 小批量数据可以正常运行&#xff08;几千条&#xff09;只要数据量一大&#xff08;上万条&#xff09;&#xff0c…

合同管理是什么,合同管理怎么做

阅读本文&#xff0c; 您可以了解&#xff1a;1、合同管理是什么&#xff1b;2、合同管理怎么做 一、合同管理是什么 合同管理是指对合同的有效执行、监督和维护过程的管理。合同是一种法律文件&#xff0c;用于规定各方之间的权利和义务。在商业和法律交易中&#xff0c;合同…

WinRAR的使用:格式转换、自动加密、自动关机

WinRAR大家应该都不陌生&#xff0c;用于将文件压缩成rar格式的压缩包&#xff0c;那么除了可以压缩文件以外&#xff0c;还有其他功能其实也很方便&#xff0c;超人今天给大家分享几个WinRAR使用小技巧。 压缩后自动关机 也许文件过大&#xff0c;那么我们压缩文件的时间就会…

MongoDB(三十九)

目录 一、概述 &#xff08;一&#xff09;相关概念 &#xff08;二&#xff09;特性 二、应用场景 三、安装 &#xff08;一&#xff09;编译安装 &#xff08;二&#xff09;yum安装 1、首先制作repo源 2、软件包名&#xff1a;mongodb-org 3、启动服务&#xff1a…

软考高级架构师下篇-11信息系统架构设计理论与实践

目录 1. 考情分析2. 基本概念3. 信息系统架构风格与分类4. 信息系统常用架构模型5. 企业信息系统总体框架6. 信息系统架构设计方法7. 前文回顾1. 考情分析 下半年软考要改成机考了,已经有几个省份确认了机考信息,虽然解决了论文手写不好修改的问题,但是考试的难度肯定加大了…

【Linux操作系统】编译过程中遇到的问题-为什么加-c?执行文件提示无法执行二进制文件?main函数参数argc和*argv[]的作用和理解?

在使用GCC编译器进行程序开发时&#xff0c;我们经常会遇到一些编译过程中的问题&#xff0c; 比如为什么要加上"-c"选项&#xff0c;以及为什么生成的可执行文件无法执行等问题。 本篇博客将详细介绍这些问题&#xff0c;并给出相应的代码和解释&#xff0c;帮助读者…

Vue编写表单常用操作(过滤和排序)

目录 HTML代码&#xff1a; js代码&#xff1a; 效果展示&#xff1a; 此次的编写代码可以直接使用 HTML代码&#xff1a; <body><div id"app"><div v-for"(value,key) in person">{{key}}--{{value}}</div><div>商品名…

NXP的官方提供的EB工具license到期后怎么续期

前安装NXP官方提供的EB工具&#xff0c;license到期了。本以为不能在试用了&#xff0c;后来在官网找了一下&#xff0c;原来是可以继续的。 小记如下&#xff1a; 我使用的是29.0版本&#xff0c; 在官网找到这个版本的EB下载位置&#xff0c;红框框里就是可以使用的…