效果如图:

工具代码:

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. 解密prompt系列27. LLM对齐经验之如何降低通用能力损失

    前面我们已经聊过众多指令微调的方案,这一章我们重点讨论下如何注入某一类任务或能力的同时,尽可能不损失模型原有的通用指令理解能力.因为在下游或垂直领域应用中,我们设计的推理任务风格或形式,往往很难通过p ...

  2. 面试连环炮系列(二十六):什么情况下JVM频繁发生full GC

    1. 什么情况下JVM频繁发生full GC? full gc触发条件是老年代空间不足,具体原因有四个: 系统并发高.执行耗时长或者创建对象过多,导致 young gc频繁,且gc后存活对象太多,但是 ...

  3. Groovy反序列化链分析

    前言 Groovy 是一种基于 JVM 的开发语言,具有类似于 Python,Ruby,Perl 和 Smalltalk 的功能.Groovy 既可以用作 Java 平台的编程语言,也可以用作脚本语言 ...

  4. State 和 Props的理解以及区别

    一.state 一个组件的显示形态可以由数据状态和外部参数所决定,而数据状态就是state,一般在 constructor 中初始化 当需要修改里面的值的状态需要通过调用setState来改变,从而达 ...

  5. 鸿蒙HarmonyO实战-ArkUI动画(组件内转场动画)

    前言 转场动画是一种在电影.视频和演示文稿中使用的动画效果,用于平滑地切换不同的场景或幻灯片.转场动画可以增加视觉吸引力,改善观众的观看体验. 常见的转场动画包括淡入淡出.滑动.旋转.放大缩小等效果. ...

  6. 【Oracle】PL/SQL制作唯一标识,固定字段+日期+流水码,流水码每日重置

    [Oracle]PL/SQL制作唯一标识,固定字段+日期+流水码,流水码每日重置 首先创建序列 create sequence sequence_name minvalue 0 maxvalue 99 ...

  7. 分类算法(Classification Algorithm)需求记录

    [toc] 比如说,在WEB扫描器场景中.一个扫描器在扫描过程中,它可以自动识别接口类型并采用相应分类规则进行漏洞检测的算法,这种通常属于一种称为"智能扫描"(Intelligen ...

  8. 力扣69(java&python)-x的平方根(简单)

    题目: 给你一个非负整数 x ,计算并返回 x 的 算术平方根 . 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 . 注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0. ...

  9. 技术干货 | jsAPI 方式下的导航栏的动态化修改

    ​简介: 操作指导:通过 jsAPI 实现导航栏的动态修改. ​ 很多开发同学在接入 H5 容器后都会对容器的导航栏进行深度定制,除了 Native 的定制化之外,还有很多场景是使用到 jsAPI 的 ...

  10. 什么是 ELF 文件(文件格式)

    ELF 是一种用于二进制文件.可执行文件.目标代码.共享库和核心转储格式文件. 是UNIX系统实验室(USL)作为应用程序二进制接口(Application Binary Interface,ABI) ...