在运行时分割图像

时间:2011-04-27 10:44:33

标签: .net image split

我有一个像这样的图像:

我想拥有它,所以我可以将这些图像用于不同的按钮和其他部分,而无需自己分割图像。我已经看到很多游戏和程序都是这样做而不需要拆分它。我该怎么做?我正在使用VB.net,所以任何.net示例都很受欢迎!

你可以在这里看到一个例子:

此图像在我玩的游戏中用作小地图,不同的部分在运行时被剪切。

2 个答案:

答案 0 :(得分:2)

我看不出自己分割图像的方法。 Something 必须从条带中提取这些单独的图像,以便您可以独立使用它们。

你显然对任何替代方法的建议(或甚至调查)都是冒犯的,所以我想我会跳过我的答案中的那部分......

在.NET中拆分它的最简单方法是使用Graphics class。它包装了GDI +并提供了一些有用的绘图相关功能。这里最重要的是DrawImage,它提供了几种不同的重载,允许您指定要从中绘制的 source 图像内的区域的尺寸。通过改变这些坐标,您可以通过将它们绘制到新的Bitmap中来提取条带中的每个单独图像。一旦你拥有Bitmap,就可以将其分配给控件,将其保存到磁盘,或者用它做任何你想做的事情。

答案 1 :(得分:2)

以下是如何在WPF中执行此操作:

using System.IO;
using System.Windows;
using System.Windows.Media.Imaging;

class Program
{
    static void Main(string[] args)
    {
        var file = @"Imagestrip1600x16.png";
        var output = @"IconsFolder";
        using (Stream imageStreamSource = new FileStream(
            file, FileMode.Open, FileAccess.Read, FileShare.Read))
        {
            PngBitmapDecoder decoder = new PngBitmapDecoder(
                imageStreamSource,
                BitmapCreateOptions.PreservePixelFormat,
                BitmapCacheOption.Default);
            BitmapSource bitmapSource = decoder.Frames[0];

            for (int i = 0; i < bitmapSource.PixelWidth / 16; i++)
            {
                CroppedBitmap croppedBitmap = new CroppedBitmap(
                    bitmapSource,
                    new Int32Rect(i * 16, 0, 16, 16));

                PngBitmapEncoder encoder = new PngBitmapEncoder();
                var frame = BitmapFrame.Create(croppedBitmap);
                encoder.Frames.Add(frame);
                var fileName = Path.Combine(output, i.ToString() + ".png");
                using (var stream = new FileStream(fileName, FileMode.Create))
                {
                    encoder.Save(stream);
                }
            }
        }
    }
}