Разделение изображения во время выполнения

#.net #image #split

#.net #изображение #разделение

Вопрос:

У меня есть изображение, подобное этому:

Я хочу иметь это, чтобы я мог использовать эти изображения для разных кнопок и других частей без необходимости разделять изображение самостоятельно. Я видел, как множество игр и программ делают это без необходимости его разделения. Как бы мне это сделать? Я использую VB.net поэтому приветствуются любые примеры .net!

Вы можете увидеть пример здесь:

Это изображение используется в качестве миникарты в игре, в которую я играю, разные части вырезаются во время выполнения.

Комментарии:

1. Нет, это невозможно. Другие игры и программы не могут использовать отдельные изображения из этой полосы «без необходимости ее разделения» . Почему вы предпочитаете использовать подобную полосу изображений вместо отдельных изображений, назначенных элементам управления?

2. Я не прошу другого решения. Я прошу помощи по рассматриваемому вопросу. Не думайте, что я хочу чего-то другого, пожалуйста.

3. Я спросил, почему вы предпочитаете свой способ, а не предполагал, что вы хотите чего-то другого. Не уверен, хочу ли я отвечать на это, мой ответ может быть недостаточно хорош для вас.

4. Независимо от причины, я делаю. Мне действительно все равно, ответите вы или нет. Если это правильно, я это проверю. Если это не так, вы можете проголосовать, если это полезно или закрыто.

5. К вашему сведению: в 11 случаях из 10 это помогает вам получить лучшие ответы, если вы А) добрее относитесь к людям, задающим простые вопросы, и Б) готовы предоставить некоторую справочную информацию о том, чего вы надеетесь достичь. Не спешите предполагать, что люди пытаются отговорить вас от того, что вы хотите сделать. Мне намного проще предоставлять подробные, конкретные советы и соответствующие фрагменты кода, если я точно понимаю, чего кто-то пытается достичь. Ваша потеря.

Ответ №1:

Я не вижу никакого способа самостоятельно разделить изображение. Что-то должно извлечь эти отдельные изображения из полосы, чтобы вы могли использовать их независимо.

Вы, по-видимому, обижаетесь на предложение (или даже запрос) каких-либо альтернативных подходов, поэтому, я думаю, я пропущу эту часть своего ответа…

Самый простой способ разделить это в .NET — использовать Graphics класс. который обертывает GDI и предоставляет несколько полезных функций, связанных с рисованием. Наиболее важным из них здесь является DrawImage , который обеспечивает несколько различных перегрузок, позволяющих указать размеры области внутри исходного изображения для рисования. Изменяя эти координаты, вы можете извлечь каждое из отдельных изображений в вашей ленте, превратив их в новое 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);
                }
            }
        }
    }
}