效果如图:

工具代码:

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#实现的一个图片切割工具的更多相关文章

  1. 一个非常好用的图片切割工具(c# winform开发) 附源码

    本人业余时间开发了一个图片切割工具,非常好用,也很灵活! 特别对大型图片切割,更能体现出该软件的优势! 开发工具为winform,源码下载地址:http://download.csdn.net/dow ...

  2. 一个非常好用的图片切割工具(c# winform开发)

    本人业余时间开发了一个图片切割工具,非常好用,也很灵活! 特别对大型图片切割,更能体现出该软件的优势! 功能说明 可以设定切割的高度和宽度.切割线可以上下拖动,可以增加一个切割区域,可设定某个区域不参 ...

  3. Android中将一个图片切割成多个图片

    有种场景,我们想将一个图片切割成多个图片.比如我们在开发一个拼图的游戏,就首先要对图片进行切割. 以下是封装好的两个类,可以实现图片的切割.仅供参考和学习. 一个是ImagePiece类,此类保存了一 ...

  4. ShoeBox一个超级好用的图片切割工具

    下载地址:http://renderhjs.net/shoebox/ ShoeBox是一个图片处理软件,体积很小. 我主要用第三个功能拆开图片.根据大图上的小图空白间隙来处理的. 导出后变成很多小图

  5. Android中将一个图片切割成多个图片[转]

    有种场景,我们想将一个图片切割成多个图片.比如我们在开发一个拼图的游戏,就首先要对图片进行切割. 以下是封装好的两个类,可以实现图片的切割.仅供参考和学习. 一个是ImagePiece类,此类保存了一 ...

  6. AEM上的一个图片转换工具

    目的: 不同情况下,同样一张图片,需要不一样大小/背景/尺寸显示. 例子: dam下面有一张940 x 300 的图片: http://localhost:4502/content/dam/geome ...

  7. unity中把一个图片切割成两个UI图片

    1.在unity3D的Project视图下选中需要更改的图片,将图片的Texture Type更改为Sprite (2D and UI),点击Apply即可.操作如图所示: 2.完成步骤一,点击App ...

  8. 图片切割工具---产生多个div切割图片 采用for和一的二维阵列设置背景位置

    照片库 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb21vZ2c=/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  9. 媳妇儿喜欢玩某音中的动漫特效,那我就用python做一个图片转化软件。

    ​    最近某音上的动漫特效特别火,很多人都玩着动漫肖像,我媳妇儿也不例外.看着她这么喜欢这个特效,我决定做一个图片处理工具,这样媳妇儿的动漫头像就有着落了.编码    为了快速实现我们的目标,我们 ...

  10. 转: ImageMagick 命令行的图片处理工具(客户端与服务器均可用)

    http://www.imagemagick.com.cn/ 关于ImageMagick ImageMagick (TM) 是一个免费的创建.编辑.合成图片的软件.它可以读取.转换.写入多种格式的图片 ...

随机推荐

  1. DevEco Studio 3.1 Beta1版本发布——新增六大关键特性,开发更高效

      智能代码编辑.端云一体化开发.低代码开发个性化-- 六大新增关键特性,开发更高效,体验更觉妙! 立即点击链接下载,做DevEco Studio 3.1 Beta1版本尝鲜者! 下载链接:HUAWE ...

  2. 开源相机管理库Aravis例程学习(二)——连续采集multiple-acquisition-main-thread

    目录 简介 例程代码 函数说明 arv_camera_set_acquisition_mode arv_camera_create_stream arv_camera_get_payload arv_ ...

  3. 「开源人说」|AI普惠,阿里灵杰开源历程与思考

    简介: 施兴 阿里巴巴资深技术专家 阿里巴巴开源项目EasyRec负责人 以下为开发者社区「开源人说」第四期--大数据&AI专场的主题分享,点击链接了解更多精彩详情 https://devel ...

  4. Cube 技术解读 | 支付宝新一代动态化技术架构与选型综述

    ​简介: 支付宝客户端的动态化技术经历三个阶段:现阶段也就是第三阶段是实体组件+部分光栅化的hybrid模式,Cube 就是该模式下的产物. ​ 如标题所述,笔者将持续更新<Cube 技术解读& ...

  5. HTML中元素分类与对应的CSS样式特点

    元素就是标签,布局中常用的有三种标签,块元素.内联元素.内联块元素,了解这三种元素的特性,才能熟练的进行页面布局. 块元素 块元素,也可以称为行元素,布局中常用的标签如:div.p.ul.li.h1~ ...

  6. [Contract] truffle-flattener 合并 Solidity 文件的依赖到一个文件

    使用 $ npm install truffle-flattener -g $ truffle-flattener <solidity-files> > output.sol 为什么 ...

  7. linux导出安装包

    linux导出安装包 1 背景 部署企业内网环境,主机无法连通外网.不能直接使用yum install安装程序.针对此种情况有如下两个安装办法 源码安装(需要编译环境,安装复杂,容易出错,不推荐) 使 ...

  8. 开源文档预览项目 kkFileView (9.9k star) ,快速入门

    kkFileView 是一款文件文档在线预览解决方案,采用流行的 Spring Boot 框架构建,易于上手和部署. 该项目基本支持主流办公文档的在线预览,包括但不限于 doc.docx.xls.xl ...

  9. juc之ConcurrentHashMap在我工作中的实践

    Map是我工作中应用比较多的数据结构之一,主要用来存储一些kv的映射信息,如果是单线程环境下我会优先使用HashMap,但是如果在多线程环境下继续使用HashMap我不确定会不会被我老大打死,为了生命 ...

  10. Typecho博客网站迁移:MySQL ➡️ MarialDB

    目录 1. 引言 2. Typecho的自定义配置迁移 3. 数据库迁移:MySQL- > MarialDB 3.1 在原服务器中备份并导出数据库文件 3.2 将"backupdb.s ...