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) 是一个免费的创建.编辑.合成图片的软件.它可以读取.转换.写入多种格式的图片 ...
随机推荐
- 面向开发者的HarmonyOS 3.0 Beta发布
原文:https://mp.weixin.qq.com/s/y0h5CUMbuFchwT7g-AqaBQ,点击链接查看更多技术内容. 2021年10月,我们面向开发者发布了HarmonyOS 3.0 ...
- 前端vue+elementUI如何实现记住密码功能
我们这回使用纯前端保存密码 既然是记住密码,前端也就是使用cookie保存,访问时用cookie读取 先来了解下cookie的基本使用吧 Cookie 所有的cookie信息都在document.co ...
- Java学生信息管理系统源码
学生信息管理系统 功能说明 学生信息管理,包括学生.班级.院系.课程.成绩等的管理. 本程序仅供学习食用. 工程环境 JDK IntelliJ IDEA MySQL 运行说明 1.安装JDK. 2.导 ...
- 剑指offer38(Java)-字符串的排列(中等)
题目: 输入一个字符串,打印出该字符串中字符的所有排列. 你可以以任意顺序返回这个字符串数组,但里面不能有重复元素. 示例: 输入:s = "abc"输出:["abc&q ...
- 通过定时SQL提取阿里云API网关访问日志指标
简介: 阿里云API网关服务提供API托管服务,提供了强大的适配和集成能力,可以将各种不同的业务系统API实现统一管理.API网关同时支持将API访问日志一键存储到日志服务,通过日志服务强大的查询分析 ...
- TiDB、OceanBase、PolarDB-X、CockroachDB二级索引写入性能测评
简介: 二级索引是关系型数据库相较于NoSQL数据库的一个关键差异.二级索引必须是强一致的,因此索引的写入需要与主键的写入放在一个事务当中,事务的性能是二级索引性能的基础.本次测试将重点关注不同分布式 ...
- 每次都需要解释大量指令?使用 PolarDB-X 向量化引擎
简介: 向量化引擎为PolarDB-X的表达式计算带来了显著的性能提升. 介绍 PolarDB-X是阿里巴巴自研的云原生分布式数据库,采用了计算-存储分离的架构,其中计算节点承担着大量的表达式计算任务 ...
- [FAQ] PHPStorm None project files detection
当你发现在 phpstorm 中编辑项目文件,却提示 None project files detection.. 并且左侧 Project 下面只有文件,没有项目目录了. 此时可以删除项目目录下的 ...
- [Gin] 单文件极简 HTTP Server 流程分析 ( gin-gonic/gin )
/** * example.go * * @link https://cnblogs.com/farwish */package main import "github.com/gin-go ...
- Django之ORM操作Mysql
一.单表操作 # 单表查询操作基本方法 class BookList(models.Model): title = models.CharField(max_length=32) price = mo ...