実現したいこと
でかいピクセル数のtiff画像を縮小したい。
30000*20000 程度
どうすればできるでしょう。
前提
以下で作成したファイル「10000.tiff」と「28000.tiff」に対して
両方を変換できる必要があります。
※実際にはもっといろいろ絵があるファイルを変換する必要があるのですが
上記ファイルでも同じエラーとなる為、上記2ファイルを変換できれば良いと考えています。
VB.Net
1Imports System.Drawing.Imaging 2Imports System.IO 3 4Public Class Form1 5 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 6 Dim bmp As Bitmap 7 Dim g As Graphics 8 9 bmp = New Bitmap(10000, 10000) 10 g = Graphics.FromImage(bmp) 11 g.Clear(Color.FromArgb(255, 0, 0)) 12 g.Dispose() 13 bmp.Save("C:\Temp\FromTiff\10000.tiff", System.Drawing.Imaging.ImageFormat.Tiff) 14 bmp.Dispose() 15 16 bmp = New Bitmap(28000, 20000, System.Drawing.Imaging.PixelFormat.Format1bppIndexed) 17 bmp.Save("C:\Temp\FromTiff\28000.tiff", System.Drawing.Imaging.ImageFormat.Tiff) 18 bmp.Dispose() 19 End Sub
該当のソースコード
以下のプログラムで「10000.tiff」は変換できるが
「28000.tiff」はエラーが出て変換できない。
VB.Net
1Imports System.Drawing.Imaging 2Imports System.IO 3 4Public Class Form1 5 6 Private Shared Function GetEncoderInfo(mimeType As String) As ImageCodecInfo 7 Dim j As Integer 8 Dim encoders() As ImageCodecInfo 9 encoders = ImageCodecInfo.GetImageEncoders() 10 For j = 0 To encoders.Length 11 If encoders(j).MimeType = mimeType Then 12 Return encoders(j) 13 End If 14 Next 15 Return Nothing 16 End Function 17 18 Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click 19 Dim myEncoder As Encoder 20 Dim myEncoderParameter As EncoderParameter 21 Dim myEncoderParameters As EncoderParameters 22 Dim myImageCodecInfo As ImageCodecInfo 23 myImageCodecInfo = GetEncoderInfo("image/jpeg") 24 myEncoderParameters = New EncoderParameters(1) 25 myEncoder = Encoder.Quality 26 myEncoderParameter = New EncoderParameter(myEncoder, 100L) 27 myEncoderParameters.Param(0) = myEncoderParameter 28 29 30 31 For Each path In {"C:\Temp\FromTiff\10000.tiff", "C:\Temp\FromTiff\28000.tiff"} 32 Using fs As FileStream = File.OpenRead(path) 33 34 Dim tBmp As Image = Image.FromStream(fs, False, False) 35 36 Dim newImg As New Bitmap(100, 100) 37 newImg.SetResolution(72, 72) 38 Dim g As Graphics = Graphics.FromImage(newImg) 39 g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic 40 g.DrawImage(tBmp, 0, 0, 100, 100) 41 g.Dispose() 42 43 tBmp.Dispose() 44 tBmp = Nothing 45 newImg.Save(Replace(Replace(path, "FromTiff", "ToTiff"), ".tiff", ".jpg"), myImageCodecInfo, myEncoderParameters) 46 47 End Using 48 Next 49 50 51 End Sub 52End Class 53 54
発生している問題・エラーメッセージ
「28000.tiff」のファイル時、g.DrawImage(tBmp, 0, 0, 100, 100)のコードにおいて
以下のエラーが出ます。
System.OverflowException: 'オーバーフロー エラーです。'
試したこと
OpenCvSharpでならできるかなと思って、一旦以下で画像を小さくしてみようとしましたが
こちらもエラーが発生しました。「10000.tiff」の方は実行できています。
VB.Net
1 Using srcImg As Mat = Cv2.ImRead(path) 2 Using resizeImg As New Mat(size:=New OpenCvSharp.Size(), type:=srcImg.Type) 3 Cv2.Resize(srcImg, resizeImg, New OpenCvSharp.Size(), 0.5, 0.5, InterpolationFlags.Area) 4 Cv2.ImWrite(topath, resizeImg) 5 End Using 6 End Using
エラー発生個所は
Cv2.Resize(srcImg, resizeImg, New OpenCvSharp.Size(), 0.5, 0.5, InterpolationFlags.Area)
で、エラー内容は
OpenCvSharp.OpenCVException: '!ssize.empty()'
でした。
尚、現在はデカくてエラーになるファイルはPhotoshopで小さくしています。
補足情報(FW/ツールのバージョンなど)
.NetFramework 4.8
Windows10
回答1件
あなたの回答
tips
プレビュー