#.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);
}
}
}
}
}