Вы можете получить размеры изображений из каждого файла и определить, насколько большим будет окончательное изображение.
Затем, как указано в комментарии , необходимо проверить, что окончательный размер не слишком велик.
Создайте новое растровое изображение, содержащее их все, затем переберите файлы, чтобы нарисовать их в большой.
Наконец, заверните все в итерации над подкаталогами, что-то вроде этого:
Итак, из этого содержимого каталога:
Я получил файл "1 .png ":
Если вы действительно хотите сохранить конечный результат в формате 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
, вероятно, должен быть функцией, которая возвращает список проблем, с которыми он столкнулся, а не отображать окна сообщений.