自己做的图片分割的小系统
能把一张大图片按照自己指定的大小来分割成几个小图片,比如 100*100的一个图片可以把它分割成10张100*10的图片,能保存当前流行的格式。具有错误日志功能,后台线程处理图片切割
这里小弟附上源代码,供大家参考,做的很粗陋,大家有什么好的想法可以交流下
源码下载地址:ImageCutOrSplit
核心代码如下:
/// <summary>
/// 图片分割
/// </summary>
/// <param name="originalPath">原始图片路径</param>
/// <param name="portionWidth">分割后图片宽</param>
/// <param name="portionHeight">分割后图片高</param>
/// <param name="savePath">保存路径</param>
/// <param name="fileName">文件名</param>
/// <param name="format">图片格式</param>
/// <param name="isSave">是否保存</param>
/// <returns>返回值</returns>
public static Image[] SplitImage(string originalPath, int portionWidth, int portionHeight, string savePath, string fileName, ImageFormat format, bool isSave)
{
Image[] images = null;
if (!File.Exists(originalPath))
return images;
using (Stream imgStream = File.OpenRead(originalPath))
{
using (Bitmap bmp = new Bitmap(imgStream))
{
images = Split(bmp, portionWidth, portionHeight, savePath, fileName, format, isSave);
}
}
return (Image[])images.Clone();
}
/// <summary>
/// 分割图片
/// </summary>
/// <param name="img">原始图片</param>
/// <param name="portionWidth">分割后图片宽</param>
/// <param name="portionHeight">分割后图片高</param>
/// <param name="savePath">保存路径</param>
/// <param name="fileName">文件名</param>
/// <param name="format">图片格式</param>
/// <param name="isSave">是否保存</param>
/// <returns>返回值</returns>
private static Image[] Split(Image img, int portionWidth, int portionHeight, string savePath, string fileName, ImageFormat format, bool isSave)
{
int imgIndex = 0;
//原始图片能分割成多少块新规格的图片
int maxHeight = img.Height;
int maxWidth = img.Width;
int heightNumber = (maxHeight % portionHeight) > 0 ? (maxHeight / portionHeight) + 1 : (maxHeight / portionHeight);
int widthNumber = (maxWidth % portionWidth) > 0 ? (maxWidth / portionWidth) + 1 : (maxWidth / portionWidth);
int allNumber = heightNumber * widthNumber;
Image[] images = new Image[allNumber];
using (Bitmap imgSplitted = new Bitmap(portionWidth, portionHeight))
{
using (Graphics g = Graphics.FromImage(imgSplitted))
{
for (int y = 0; y < maxHeight; y += portionHeight)
{
for (int x = 0; x < maxWidth; x += portionWidth)
{
try
{
g.Clear(Color.Transparent);
g.DrawImage(img, new Rectangle(0, 0, portionWidth, portionHeight), x, y, portionWidth, portionHeight, GraphicsUnit.Pixel);
g.Save();
if (isSave)
{
if (!Directory.Exists(savePath))
{
Directory.CreateDirectory(savePath);
Thread.Sleep(1000);
}
imgSplitted.Save(Path.Combine(savePath, fileName + imgIndex.ToString() + "." + format.ToString()), format);
}
images[imgIndex] = imgSplitted.Clone() as Image;
imgIndex++;
}
catch (Exception ex)
{
throw new LogException("Split", ex.Message);
}
}
}
}
}
return images;
}