VB. net объединить изображение из папки - PullRequest
0 голосов
/ 17 апреля 2020

есть папка с именем "1"
"1", в ней находится от 1 до 100 файлов изображений.
пример имени файла: 000001.jpg 0000012.jpg 0000013.jpg ---> 000100.jpg

Я хочу объединить все изображения из этой папки (с именем 1)
и извлечь в один файл (output_1.jpg) из 100 файлов в 1 файл (по вертикали)

но если имеется 10 папок, объедините все изображения из папки 1,2,3 .....
и извлеките по одному файлу в папку
output_1.jpg (все изображения из папки 1)
output_2.jpg (все изображение из папки 2)
output_3.jpg (все изображение из папки 3)
и более

структура папки:
----- c: \
---------- папка1 \
--------------------- 000001.jpg
- -------------------- 000002.jpg

объединенный файл изображения будет извлечен в c: \ (не в папке 1 или 2 или 3 ....)

это мой код, я должен добавить больше кода файла за файлом, чтобы объединить их (атака головной боли)

    Dim Img1 As Bitmap = Image.FromFile("C:\1\000001.jpg")
    Dim Img2 As Bitmap = Image.FromFile("C:\1\000002.jpg")
    Dim Img3 As Bitmap = Image.FromFile("C:\1\000003.jpg")
    Dim Img4 As Bitmap = Image.FromFile("C:\1\000004.jpg")
    Dim Img5 As Bitmap = Image.FromFile("C:\1\000005.jpg")

    Dim extract_img As Bitmap
    Dim Width As Integer
    Dim Height As Integer
    Dim x As Integer
    Dim y As Integer

    If Img1.Width > Img2.Width Then
        Width = Img1.Width
    Else
        Width = Img2.Width
    End If

    Height = Img1.Height + Img2.Height + Img3.Height + Img4.Height + Img5.Height
    extract_img = New Bitmap(Width, Height)

    For x = 0 To Img1.Width - 1
        For y = 0 To Img1.Height - 1
            extract_img.SetPixel(x, y, Img1.GetPixel(x, y))
        Next
    Next
    For x = 0 To Img2.Width - 1
        For y = 0 To Img2.Height - 1
            extract_img.SetPixel(x, y + Img1.Height, Img2.GetPixel(x, y))
        Next
    Next
    For x = 0 To Img3.Width - 1
        For y = 0 To Img3.Height - 1
            extract_img.SetPixel(x, y + Img1.Height + Img2.Height, Img3.GetPixel(x, y))
        Next
    Next
    For x = 0 To Img4.Width - 1
        For y = 0 To Img4.Height - 1
            extract_img.SetPixel(x, y + Img1.Height + Img2.Height + Img3.Height, Img4.GetPixel(x, y))
        Next
    Next
    For x = 0 To Img5.Width - 1
        For y = 0 To Img5.Height - 1
            extract_img.SetPixel(x, y + Img1.Height + Img2.Height + Img3.Height + Img4.Height, Img5.GetPixel(x, y))
        Next
    Next

    extract_img.Save("C:\output.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)

1 Ответ

1 голос
/ 17 апреля 2020

Вы можете получить размеры изображений из каждого файла и определить, насколько большим будет окончательное изображение.

Затем, как указано в комментарии , необходимо проверить, что окончательный размер не слишком велик.

Создайте новое растровое изображение, содержащее их все, затем переберите файлы, чтобы нарисовать их в большой.

Наконец, заверните все в итерации над подкаталогами, что-то вроде этого:

Итак, из этого содержимого каталога:

enter image description here

Я получил файл "1 .png ":

enter image description here

Если вы действительно хотите сохранить конечный результат в формате JPEG, вы, вероятно, захотите прочитать Как: установить уровень сжатия JPEG , поскольку значение по умолчанию ниже хорошего качества. Вам нужно будет добавить

Private Shared Function GetEncoder(ByVal format As ImageFormat) As ImageCodecInfo

    Dim codecs As ImageCodecInfo() = ImageCodecInfo.GetImageDecoders()

    Dim codec As ImageCodecInfo
    For Each codec In codecs
        If codec.FormatID = format.Guid Then
            Return codec
        End If
    Next codec
    Return Nothing

End Function

и изменить MakeSprites на

Sub MakeSprites(rootDir As String)
    Dim jpegEncoder As ImageCodecInfo = GetEncoder(ImageFormat.Jpeg)
    Dim myEncoder As Imaging.Encoder = Imaging.Encoder.Quality
    Dim myEncoderParameters As New EncoderParameters(1)
    Dim myEncoderParameter As New EncoderParameter(myEncoder, 85L)
    myEncoderParameters.Param(0) = myEncoderParameter

    For Each srcDir In New DirectoryInfo(rootDir).EnumerateDirectories

        Dim overallSize = GetOverallImageSize(srcDir.FullName)

        If overallSize.Width = 0 OrElse overallSize.Height = 0 Then
            MsgBox("No suitable image files found in " & srcDir.FullName)
            Continue For
        End If

        If overallSize.Width > 32767 OrElse overallSize.Height > 32767 Then
            MsgBox("Combined size of " & overallSize.ToString() & " is too large in " & srcDir.Name)
            Continue For
        End If

        Using bmp As New Bitmap(overallSize.Width, overallSize.Height, PixelFormat.Format24bppRgb)
            Dim g = Graphics.FromImage(bmp)
            Dim y = 0

            For Each f In Directory.EnumerateFiles(srcDir.FullName, "*.jpg")
                Using im = Image.FromFile(f)
                    g.DrawImage(im, 0, y)
                    y += im.Height
                End Using
            Next

            bmp.Save(Path.Combine(rootDir, srcDir.Name & ".jpg"), jpegEncoder, myEncoderParameters)

        End Using

    Next

End Sub

Вы должны быть разочарованы результатом - особенно на границах между изображениями. Просто дело в том, как работает JPEG-кодирование.

Возможно, вы захотите добавить несколько Try ... Ловит слишком, когда что-то не так go. И метод MakeSprites, вероятно, должен быть функцией, которая возвращает список проблем, с которыми он столкнулся, а не отображать окна сообщений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...