获取位图的某个正方形区域

本文关键字:正方形 区域 位图 获取 | 更新日期: 2023-09-27 18:22:22

嘿,伙计们,我想知道是否有办法获得位图的某个区域?我正在尝试制作一个tileset剪切器,我需要它迭代加载的tileset,将图像剪切成xscale*yscale图像,然后单独保存。我目前正在使用这个循环进行切割程序。

         int x_scale, y_scale, image_width, image_height;
         image_width = form1.getWidth();
         image_height = form1.getHeight();
         x_scale = Convert.ToInt32(xs.Text);
         y_scale = Convert.ToInt32(ys.Text);
         for (int x = 0; x < image_width; x += x_scale)
         {
             for (int y = 0; y < image_height; y += y_scale)
             {
                 Bitmap new_cut = form1.getLoadedBitmap();//get the already loaded bitmap

             }
         }

那么,有没有一种方法可以"选择"位图new_cut的一部分,然后保存该部分?

获取位图的某个正方形区域

您可以使用LockBits方法来获取位图矩形区域的描述。类似的东西

// tile size
var x_scale = 150;
var y_scale = 150;
// load source bitmap
using(var sourceBitmap = new Bitmap(@"F:'temp'Input.png"))
{
    var image_width = sourceBitmap.Width;
    var image_height = sourceBitmap.Height;
    for(int x = 0; x < image_width - x_scale; x += x_scale)
    {
        for(int y = 0; y < image_height - y_scale; y += y_scale)
        {
            // select source area
            var sourceData = sourceBitmap.LockBits(
                new Rectangle(x, y, x_scale, y_scale),
                System.Drawing.Imaging.ImageLockMode.ReadOnly,
                sourceBitmap.PixelFormat);
            // get bitmap for selected area
            using(var tile = new Bitmap(
                sourceData.Width,
                sourceData.Height,
                sourceData.Stride,
                sourceData.PixelFormat,
                sourceData.Scan0))
            {
                // save it
                tile.Save(string.Format(@"F:'temp'tile-{0}x{1}.png", x, y));
            }
            // unlock area
            sourceBitmap.UnlockBits(sourceData);
        }
    }
}

您可以使用Graphics对象的SetClip方法将图像的区域剪切到新图像中。

一些重载采用Rectangle结构,该结构表示要在图像中剪裁的内容的边界框。