1. 程式人生 > 其它 >C#實現的一個圖片切割工具

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("圖片切割完畢");
    }
}