' https://docs.microsoft.com/ja-jp/windows/desktop/gdiplus/-gdiplus-constant-property-item-descriptions#propertytagindexbackground Const PropertyTagIndexBackground As Integer = &H5103
' https://docs.microsoft.com/ja-jp/windows/desktop/gdiplus/-gdiplus-constant-property-item-descriptions#propertytagindextransparent Const PropertyTagIndexTransparent As Integer = &H5104
Dim img As Image = 画像 Dim colBackground As Color? = Nothing Dim colTransparent As Color? = Nothing If ImageFormat.Gif.Equals(img.RawFormat) Then Dim idx As Byte? idx = img.PropertyItems().FirstOrDefault(Function(p) p.Id = PropertyTagIndexBackground)?.Value?(0) If idx.HasValue Then colBackground = img.Palette.Entries(idx.Value) End If idx = img.PropertyItems().FirstOrDefault(Function(p) p.Id = PropertyTagIndexTransparent)?.Value?(0) If idx.HasValue Then colTransparent = img.Palette.Entries(idx.Value) End If End If
For i = 0 To baseImages.Length - 1 Dim bmp As Bitmap = baseImages(i) bmp.Save(ms, ImageFormat.Gif) ms.Position = 0 : : Next
と処理していますが、本当に必要なのは bmp 変数では無く、それを Gif 形式で Save しなおしたときのバイナリ(上記で言うと変数 ms の内容)ですよね。 しかも、ループ処理で 1 つずつ順次処理しているだけですから、そもそも、Bitmap クラスに 500 個同時にロードしておく必要は無さそうです。
たとえば As Bitmap() ではなく As IEnumerable(Of Bitmap) に変更すれば Iterator Function を通じて Using bmp As New Bitmap(〜) Yield bmp End Using などを渡すこともできるかと思います。
あるいはもっと単純に、フォルダー名だけを渡すようにして For Each filePath In Directory.EnumerateFiles(targetFolder, "*.png") Using bmp As New Bitmap(filePath) bmp.Save(ms, ImageFormat.Gif) End Using ms.Position = 0 : : Next などとしても良いわけで。