c# 怎样实现用几张图片制作 gif?怎样对图片像素值进行修改?上代码

本文主要是介绍c# 怎样实现用几张图片制作 gif?怎样对图片像素值进行修改?上代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转载请注明出处 http://blog.csdn.net/sinat_23079759/article/details/77989301

c# 本身是没有制作 gif 的这个工具类的,所以这个类只能自己来写。

但是不管是 picturebox 控件,还是 Image,都支持赋值 gif,也就是说,可以直接把从文件读取到的 gif 赋给 Image,继而显示到控件中。

如 

String gif_temp_path = "d://temp.gif";//某个 gif 文件
Image gif_img = Image.FromFile(gif_temp_path);
pictureBox1.Image = gif_img;
可以将 d://temp.gif 这个路径下的 gif 显示到 pictureBox1 控件中。


那么我们怎样制作自己的 gif 呢?
给出一个我自己的方法:
只要将多个图片(Image [] img_list)作为一个数组传入,就可以生成这些图片组成的 gif, 并保存到指定目录下。

private void make_gif(int delay_time, Image [] img_list, bool repeat, bool fanzhuan)//delay_time 两帧间隔时间; repeat 是否重复; fanzhuan 是否反转播放
{int img_num = img_list.Length;//需要制作的图片数量AnimatedGifEncoder mygif = new AnimatedGifEncoder();String gif_temp_path = "d://temp.gif";//生成的 gif 文件,要保存的路径mygif.Start(gif_temp_path);		mygif.SetDelay(delay_time);    //每两帧的间隔时间//-1:不重复,0:重复//repeat ? 0 : -1mygif.SetRepeat(repeat ? 0 : -1);for (int i = 0; i < img_num; i++){mygif.AddFrame(img_list[i]);}if(fanzhuan)//添加 gif 反向播放功能{for (int i = (img_num - 2)>0?((img_num - 2)):0; i > 0; i--){mygif.AddFrame(img_list[i]);}}mygif.Finish();
}
// “?:” 为三元操作符,a?b:c 表示:如果 a 为真,则 a?b:c 的值为 b,否则为 c。
当你将这段代码复制到你的工程代码中时,发现 AnimatedGifEncoder 这个类报错,查看“显示可能的修补程序”,并没有 using 选项,
那就说明这个类并不是 c# 语言自带的。
是的,这个类是我们自己写的(当然不是我写的)。

这个资源我已经放到 csdn 上,点击 这里 下载。

共需要四个类,AnimatedGifEncoder,GifDecoder,NeuQuant,LZWEncoder
只要你在你的项目下新建个 c# 类文件,将这四个类放进去,就可以调用了。当然如果不嫌乱,直接和窗体类放到一起也行。

有一点小麻烦的就是,如果想要生成的 gif 直接显示到 pictureBox 中,必须生成 gif 到某个地址后,再从这个地址读取。
记得 pictureBox 每次显示新 gif 图片的时候,需要 Dispose 一下,否则不会更新的哦。
具体代码是:if (pictureBox1.Image != null) {pictureBox1.Image.Dispose();}

这里再放一段代码,让大家可以自己修改某图片的像素值,并生成新图片。这样我们就可以自己用代码制作炫酷的 gif 了。(如 从一张图片渐变到另一张图片的效果。)
对图片的处理要使用到 Bitmap,而不是 Image,所以首先要知道他们的相互转化。

Image -> Bitmap
Image img1;
...
Bitmap img_bitmap = new Bitmap(img1);


Bitmap -> Image
//(直接赋值就好)
Image img2 = img_bitmap;//img_bitmap 是已知 Bitmap 类型图片


接下来两段代码,Bitmap 类型图片转化为 三维整形数组,和 三维整形数组转化为 Bitmap 图片。
这样我们就可以通过修改“三维整形数组”中的数据,来处理图片了。

public static int[,,] get_pic_int(Bitmap bitimg)// bitmap 转化为 int[,,]类型
{int[,,] img_int = new int[bitimg.Width, bitimg.Height, 3];for (int i = 0; i < bitimg.Width; i++){for (int j = 0; j < bitimg.Height; j++){img_int[i, j, 0] = bitimg.GetPixel(i, j).R;img_int[i, j, 1] = bitimg.GetPixel(i, j).G;img_int[i, j, 2] = bitimg.GetPixel(i, j).B;}}return img_int;
}......//对 三维数据进行自己的修改,比如变暗一点,可以把每个数据乘以 0.5 (这里是图像处理部分)public static Bitmap int_to_bitimg(int[,,] from, int x, int y)// int[,,] 转化为 bitmap 类型;x,y 分别是生成图片的宽高
{Bitmap bitimg = new Bitmap(x, y);Color temp_color;for (int i = 0; i < x; i++){for (int j = 0; j < y; j++){temp_color = Color.FromArgb(255, from[i, j, 0], from[i, j, 1], from[i, j, 2]);bitimg.SetPixel(i, j, temp_color);}}return bitimg;
}

这样就可以实现图像处理啦!!


最后,再一次声明生成 gif 需要四个类文件,这四个文件下载的地址是:点击 这里。

这篇关于c# 怎样实现用几张图片制作 gif?怎样对图片像素值进行修改?上代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/514319

相关文章

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

2. c#从不同cs的文件调用函数

1.文件目录如下: 2. Program.cs文件的主函数如下 using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using System.Windows.Forms;namespace datasAnalysis{internal static

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n