質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.54%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

621閲覧

でかいピクセル数のtiff画像を縮小したい。

xail2222

総合スコア1495

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2023/04/21 15:00

編集2023/04/21 15:04

実現したいこと

でかいピクセル数の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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2023/04/23 00:55

質問者さん、回答したのでそれに対するフィードバックを返してください。役に立った/立たなかったぐらいはすぐに返せるのでは?  InterpolationMode は下げられないので私の回答ではダメということなら、その旨書いてください。
xail2222

2023/04/23 12:12

すみません。お知らせ一覧に出てくるものだと思ってたので、それをチェックしていたのですが、お知らせ一覧に出なくなったのですね。反応遅くてすみませんでした。
guest

回答1

0

ベストアンサー

ググるとヒットする ↓ こういうの見ましたか?

https://social.msdn.microsoft.com/Forums/windows/en-US/d6c0ef02-e3c9-4b7d-a053-fd64ecb06470/overflowexception-in-graphicsdrawimage-using-interpolationmode-highqualitybicubic?forum=winforms

https://www.codeproject.com/Messages/4709493/Re-How-to-resize-tiff-image.aspx

対症療法的ですが InterpolationMode を Bicubic, Bilinear ぐらいに下げれば OverflowException は回避できるようです。

下げられないということですと自分には解決策は分かりません。他の方の回答をお待ちください。

投稿2023/04/22 03:53

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xail2222

2023/04/23 12:20 編集

回答で教えて頂いたググった結果のHPは私は未確認でした。情報ありがとうございます。 >対症療法的ですが InterpolationMode を Bicubic, Bilinear ぐらいに下げれば OverflowException は回避できるようです。 とりあえず、HighQualityBicubicで処理できるくらいまで他のパラメータでサイズを小さくしてから 最後にHighQualityBicubicで処理すれば精度的にもいけそうな気はします。一旦試してみます。 反応遅くてすみませんでした。
xail2222

2023/04/23 12:37

InterpolationMode を変えてサンプルのtiffは変換できることが確認できました。 実際のファイルは、今手元にないため実際のファイルで使用に足るか明日確認します。
xail2222

2023/04/24 11:39

一旦、20000ピクセルくらいにDefaultで縮小するくらいであれば画像的にあまり見た目は変わらず そこから、HighQualityBicubicで変換することで、見た目的にはあまり問題ない感じに出来ました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.54%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

同じタグがついた質問を見る

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。