Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Сохранение нескольких картинок в одну


Автор: VitalicH 28.7.2007, 09:25
Подскажите пожалуйста как сделать сохранение нескольких картинок в одну с учетом расположения на исходном изображении каждой картинки?

Автор: stab 28.7.2007, 09:34
т.е. требуется получить GIF из нескольких кадров? или что? smile

Автор: VitalicH 28.7.2007, 09:36
Мне необходимо загрузить несколько BMP картинок и построить их в ряд в одной картинке

Автор: stab 28.7.2007, 09:38
создавай одну большую и рисуй их туда в ряд. в чём собственно сложность?

Автор: VitalicH 28.7.2007, 09:48
Сложность в незнании команд которые нужно применить 

Автор: stab 28.7.2007, 10:16
всё что тебе нужно это два класса: Bitmap и Graphics:

загрузка изображения: Bitmap bitmap = new Bitmap("image.jpg");
сохранение: bitmap.Save("image.jpg", ImageFormat.Jpeg);
создание нового битмапа произвольных размеров: Bitmap bitmap = new Bitmap(100, 100);
получение Graphics для битмапа: Graphics graphics = Graphics.FromImage(bitmap);
рисование одного битмапа на другом: graphics.DrawImage(bitmap2, 0, 0);

не забывай вызывать Dispose() по завершении работы с Bitmap и Graphics.




Автор: VitalicH 28.7.2007, 10:17
Большое спасибо

Автор: mr.DUDA 28.7.2007, 10:29
Код
using System;
using System.Drawing;
using System.Drawing.Imaging;

class Program
{
    // объединяет несколько картинок в одну, выстраивая их по горизонтали
    static Bitmap CombineImages(Image[] images)
    {
        // определяем размер выходной картинки
        // высота будет = максимальной картинке, ширина = сумме
        int width = 0, height = 0;
        foreach (Image image in images)
        {
            width += image.Width;
            height = Math.Max(height, image.Height);
        }

        // склеиваем картинку
        Bitmap result = new Bitmap(width, height);
        using (Graphics gr = Graphics.FromImage(result))
        {
            // фон будет белым
            gr.FillRectangle(Brushes.White, new Rectangle(0, 0, width, height));

            int x = 0;
            foreach (Image image in images)
            {
                // центрируем по вертикали
                int y = (height - image.Height) / 2;
                
                // рисуем картинку
                gr.DrawImage(image, new Point(x, y));
                
                // сдвигаемся вправо
                x += image.Width;
            }
        }

        return result;
    }

    static void Main()
    {
        // к примеру, грузим 3 картинки из файлов
        Image[] images = new Image[]
        {
            Image.FromFile(@"c:\1.jpg"),
            Image.FromFile(@"c:\2.gif"),
            Image.FromFile(@"c:\3.jpg")
        };

        // склеиваем в одну и сохраняем на диск
        Bitmap result = CombineImages(images);
        result.Save(@"c:\result.bmp", ImageFormat.Bmp);
    }
}

Автор: VitalicH 28.7.2007, 11:52
Все получилось вот только картинки в конечном файле шире чем в исходных и получается что одна на другой нарисовано 
исходные по 90 ,а в конечном файле получаются по 120

как бы это исправить?

Автор: mr.DUDA 28.7.2007, 12:17
Странно, у меня всё нормально работает.

Автор: stab 28.7.2007, 12:40
VitalicH, похоже dpi влияет. попробуй рисовать так:

Код

gr.DrawImage(image, x, y, image.Width, image.Height);

Автор: VitalicH 28.7.2007, 12:45
Все получилось большое спасибо вам.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)