C#实现的一个图片切割工具
效果如图:

工具代码:
using System.Drawing;
using System.Drawing.Imaging; class ImageCutterConfig
{
/// <summary>
/// MIME类型,如果用“image/jpeg”切割后的图片会模糊,目前还不知道为啥
/// </summary>
public const string mimeType = @"image/png"; //@"image/jpeg";//
} /// <summary>
/// 图形切割配置
/// </summary>
public class GridData
{
/// <summary>
/// 原始图片的文件
/// </summary>
public string SrcFileName = @"D:\0_lugsProjects\MapCutter\SourceMap.jpg";
/// <summary>
/// 切割后的图片输出目录
/// </summary>
public string OutDirectory = @"D:\0_lugsProjects\MapCutter\Res\";
/// <summary>
/// 图片宽度
/// </summary>
public int ImageWidth = 3000;
/// <summary>
/// 图片高度
/// </summary>
public int ImageHeight = 1900;
/// <summary>
/// 格子宽度
/// </summary>
public int GridWidth = 256;
/// <summary>
/// 格子高度
/// </summary>
public int GridHeight = 256;
/// <summary>
/// 切片文件前缀
/// </summary>
public string titlePrefixName = "WorldMap_";
/// <summary>
/// 切片文件扩展名
/// </summary>
public string expandedName = @".jpg";
} /// <summary>
/// 图片切割工具参数
/// </summary>
class ToolParam
{
public Image srcImage;
public GridData imageData;
public ImageCodecInfo codecInfo;
public EncoderParameters encoderParams;
public int columnNum;
public int rowNum; public int columnIndex;
public int rowIndex; public ToolParam(Image srcImage, GridData imageData, ImageCodecInfo codecInfo, EncoderParameters encoderParams, int columnNum, int rowNum)
{
this.srcImage = srcImage;
this.imageData = imageData;
this.codecInfo = codecInfo;
this.encoderParams = encoderParams;
this.columnNum = columnNum;
this.rowNum = rowNum;
RefreshIndex(0, 0);
} public void RefreshIndex(int columnIndex, int rowIndex)
{
this.columnIndex = columnIndex;
this.rowIndex = rowIndex;
}
} class ImageCutterTool
{
/// <summary>
/// 切割图片并保存
/// </summary>
/// <param name="data"></param>
public static void SaveSlice(ToolParam data)
{
int index = data.rowIndex * data.columnNum + data.columnIndex + 1;
int w = data.imageData.GridWidth;
int h = data.imageData.GridHeight;
int x = data.columnIndex * data.imageData.GridWidth;
int y = data.rowIndex * data.imageData.GridHeight;
if ((data.columnIndex + 1) * data.imageData.GridWidth > data.srcImage.Width)
{
w = data.srcImage.Width - data.columnIndex * data.imageData.GridWidth;
}
if ((data.rowIndex + 1) * data.imageData.GridHeight > data.srcImage.Height)
{
h = data.srcImage.Height - data.rowIndex * data.imageData.GridHeight;
} Bitmap destBitMap = new Bitmap(w, h, PixelFormat.Format24bppRgb);
using (Graphics g = Graphics.FromImage(destBitMap))
{
g.Clear(Color.Transparent);
g.DrawImage(data.srcImage, new Rectangle(0, 0, w, h), x, y, w, h, GraphicsUnit.Pixel);
string name = data.imageData.OutDirectory + data.imageData.titlePrefixName + index.ToString("D2") + data.imageData.expandedName;
destBitMap.Save(name, data.codecInfo, data.encoderParams);
}
} /// <summary>
/// 获取图像编解码器
/// </summary>
/// <param name="mimeType">MIME类型</param>
/// <returns></returns>
public static ImageCodecInfo GetEncodeInfo(string mimeType)
{
ImageCodecInfo[] infos = ImageCodecInfo.GetImageEncoders();
for (int i = 0, iMax = infos.Length; i < iMax; ++i)
{
ImageCodecInfo info = infos[i];
if (mimeType == info.MimeType)
{
return info;
}
}
return null;
}
}
测试代码:
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Windows; class lgs
{
static void Main()
{
GridData data = new GridData();
Image srcImage = Image.FromFile(data.SrcFileName);
int width = srcImage.Width;
int height = srcImage.Height;
//列数
int columnNum = (int)Math.Ceiling(width * 1.0f / data.GridWidth);
//行数
int rowNum = (int)Math.Ceiling(height * 1.0f / data.GridHeight); ImageCodecInfo codecInfo = ImageCutterTool.GetEncodeInfo(ImageCutterConfig.mimeType);
EncoderParameters encoderParams = new EncoderParameters(2);
encoderParams.Param[0] = new EncoderParameter(Encoder.ColorDepth, 1L);
encoderParams.Param[1] = new EncoderParameter(Encoder.Quality, 1L); ToolParam toolParam = new ToolParam(srcImage, data, codecInfo, encoderParams, columnNum, rowNum);
for (int i = 0; i < rowNum; ++i)
{
for (int j = 0; j < columnNum; ++j)
{
toolParam.RefreshIndex(j, i);
ImageCutterTool.SaveSlice(toolParam);
}
} MessageBox.Show("图片切割完毕");
}
}
C#实现的一个图片切割工具的更多相关文章
- 一个非常好用的图片切割工具(c# winform开发) 附源码
本人业余时间开发了一个图片切割工具,非常好用,也很灵活! 特别对大型图片切割,更能体现出该软件的优势! 开发工具为winform,源码下载地址:http://download.csdn.net/dow ...
- 一个非常好用的图片切割工具(c# winform开发)
本人业余时间开发了一个图片切割工具,非常好用,也很灵活! 特别对大型图片切割,更能体现出该软件的优势! 功能说明 可以设定切割的高度和宽度.切割线可以上下拖动,可以增加一个切割区域,可设定某个区域不参 ...
- Android中将一个图片切割成多个图片
有种场景,我们想将一个图片切割成多个图片.比如我们在开发一个拼图的游戏,就首先要对图片进行切割. 以下是封装好的两个类,可以实现图片的切割.仅供参考和学习. 一个是ImagePiece类,此类保存了一 ...
- ShoeBox一个超级好用的图片切割工具
下载地址:http://renderhjs.net/shoebox/ ShoeBox是一个图片处理软件,体积很小. 我主要用第三个功能拆开图片.根据大图上的小图空白间隙来处理的. 导出后变成很多小图
- Android中将一个图片切割成多个图片[转]
有种场景,我们想将一个图片切割成多个图片.比如我们在开发一个拼图的游戏,就首先要对图片进行切割. 以下是封装好的两个类,可以实现图片的切割.仅供参考和学习. 一个是ImagePiece类,此类保存了一 ...
- AEM上的一个图片转换工具
目的: 不同情况下,同样一张图片,需要不一样大小/背景/尺寸显示. 例子: dam下面有一张940 x 300 的图片: http://localhost:4502/content/dam/geome ...
- unity中把一个图片切割成两个UI图片
1.在unity3D的Project视图下选中需要更改的图片,将图片的Texture Type更改为Sprite (2D and UI),点击Apply即可.操作如图所示: 2.完成步骤一,点击App ...
- 图片切割工具---产生多个div切割图片 采用for和一的二维阵列设置背景位置
照片库 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb21vZ2c=/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...
- 媳妇儿喜欢玩某音中的动漫特效,那我就用python做一个图片转化软件。
最近某音上的动漫特效特别火,很多人都玩着动漫肖像,我媳妇儿也不例外.看着她这么喜欢这个特效,我决定做一个图片处理工具,这样媳妇儿的动漫头像就有着落了.编码 为了快速实现我们的目标,我们 ...
- 转: ImageMagick 命令行的图片处理工具(客户端与服务器均可用)
http://www.imagemagick.com.cn/ 关于ImageMagick ImageMagick (TM) 是一个免费的创建.编辑.合成图片的软件.它可以读取.转换.写入多种格式的图片 ...
随机推荐
- jenkins 持续集成和交付 —— 参数化构建(八)
前言 这个其实就是我们构建的脚本时候希望能有一些变量,能给我们更多的选择. 正文 选择这个: 填好后,这边就有一个参数配置: 那么接下来就是把变量放到我们的脚本中. 如下: 脚本变成变量符,这样就ok ...
- c# webapi 自定义返回数据
前言 webapi呢,我们创建的时候我给我们5个方法:get get(data)put post delete. 很明显,get,get(data)是用来获取,post用来修改数据的,put,dele ...
- 使用 Docker 部署 instantbox 轻量级 Linux 系统
1)instantbox 介绍 GitHub:https://github.com/instantbox/instantbox instantbox 是一款非常实用的项目,它能够让你在几秒内启动一个主 ...
- mysql5.7.20靠谱安装步骤
首先,我看过网上的其他教程. 其次,很多教程都过时了,或者按照步骤失败,反正我一次也没成功. 开始正题:首先,以管理员身份运行cmd 总共就两个命令: 1.mysqld --initialize-in ...
- 02_Vue模板语法
Vue模板语法有2大类: 1.插值语法: 功能:用于解析标签体内容. 写法:{{xxx}},xxx是js的表达式,且可以直接读取到data中的所 ...
- 3 种发布策略,解决 K8s 中快速交付应用的难题
作者 | 郝树伟(流生)阿里云高级研发工程师 前言 软件技术更新换代很快,但我们追求的目标是一直不变的,那就是在安全稳定的前提下,增加应用的部署频率,缩短产品功能的迭代周期,这样的好处就是企业可以在更 ...
- 2019-10-14-云之幻-UWP-视频教程
title author date CreateTime categories 云之幻 UWP 视频教程 lindexi 2019-10-14 21:8:26 +0800 2019-10-14 21: ...
- 3. ETCD数据备份与恢复
首先为运行在https://127.0.0.1:2379 上的现有etcd实例创建快照并将快照保存到 /srv/data/etcd-snapshot.db. 注:为给定实例创建快照预计能在几秒钟内完成 ...
- 让 KEPServer 变成一款 Web 组态软件
KEPServerEX是行业领先的连接平台,用于向您的所有应用程序提供单一来源的工业自动化数据.该平台的设计使用户能够通过一个直观的用户界面来连接.管理.监视和控制不同的自动化设备和软件应用程序. ...
- 【爬虫数据集】滇西小哥YouTube频道TOP10热门视频的热评数据,共2W条!
目录 一.背景介绍 二.爬取目标 三.结果展示 四.演示视频 五.附完整数据 一.背景介绍 滇西小哥是一位来自中国云南省的视频博主,他在YouTube上拥有超过1000万的订阅者和上亿的观看量.他的视 ...