Страницы

Поиск по вопросам

пятница, 10 января 2020 г.

Склеить, объединить фото (jpeg карта)

#c_sharp #изображения #jpeg


Есть много файлов одной карты COLUMN_LINE.jpeg все файлы одинакового размера - 256х256 px.

Как их можно склеить в один файл jpeg?

P.S.:
Если входные файлы 001_001.jpeg 001_002.jpeg 002_001.jpeg 002_001.jpeg, то полученный
map.jpeg будет 512х512 px.



Простите, пожалуйста. Может я не достаточно явно описал проблему.

Уточняю: входных файлов может быть очень МНОГО (например 100х100=10 000 изображений).
И надо запусть это на 4 ГБ RAM (ну учитывая, что и система должна как-то работать).



На 10 000 не тестил. Просто загрузить такое количество картинок напряжно. Но поделюсь
кодом с помощью которого произвел склейку.

И еще я напутал - у меня .png,а не .jpeg. Но принцип тот же. Разница есть, но кому
надо разберетесь.

using System;
using System.IO;
using System.Drawing;

class IMGhelper
{
    public int NeedCOLUMN; // я знаю сколько должно быть колонок
    public int NeedLINE; // я знаю сколько должно быть строк
    // потому что я сначала задал программе скачать это кол-во колонок и строк

    private string[,] m_filesExist; // тут будут хранится пути ко всем картинкам

    private void getFiles() // будьте осторожны! Этот метод работает в МОИХ условиях
    // У вас тут может выпасть ИСКЛЮЧЕНИЕ!
    {
        m_filesExist = new string[NeedCOLUMN, NeedLINE];
        string[] dirs = Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory
+ "Map\\", "*.png"); // маленькие картинки в папке Map
        foreach (string dir in dirs)
        {
            // мои файлы называются ххх_ххх.png (например 017_010.png)
            string[] tmp = Path.GetFileName(dir).Split('.')[0].Split('_');

            int col = int.Parse(tmp[0]); // тут 017
            int row = int.Parse(tmp[1]); // тут 010
            m_filesExist[col, row] = dir;
        }
    }

    public void ImgCombine()
    {
        readFiles();
        // Создаем новый image нужного размера (это будет объединенный image)
        Image img = new Bitmap(256 * NeedCOLUMN, 256 * NeedLINE);// у меня каждое
изображение 256x256 px

        // Делаем этот image нашим контекстом, куда будем рисовать
        Graphics g = Graphics.FromImage(img);

        // рисуем существующие маленькие image в созданный нами большой image
        for (int c = 0; c < NeedCOLUMN; c++)
        {
            for (int r = 0;r < NeedLINE; r++)
            {
                g.DrawImage(Image.FromFile(m_filesExist[c,r]), new Point(256*c, 256*r));
            }
        }

        // Записываем обобщенный image в файл рядом с исполняемым файлом

        img.Save("output.png", System.Drawing.Imaging.ImageFormat.Png);
    }
}


И вызов

static void Main(string[] args)
{
    IMGhelper IH = new IMGhelper();
    //у меня 600 изображений из них должно получится 20 колонок и 30 строк
    IH.NeedCOLUMN = 20;
    IH.NeedLINE = 30;

    IH.ImgCombine();
}

    


Ответы

Ответ 1



Примерно так: Создаёшь Bitmap нужного размера Graphics.FromBitmap По нужным координатам рисуешь куски через Graphics.DrawImageUnscaled Сохраняешь Bitmap в файл

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

Отправить комментарий