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

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

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

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

Q&A

解決済

2回答

9797閲覧

VB.NETにてPNG画像をJPEG画像に変更して保存する際に、透過部が黒くなるのを回避するにはどうしたらよいか

okamu

総合スコア11

VB.NET

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

0グッド

1クリップ

投稿2015/11/12 01:17

編集2015/11/12 04:05

###前提・実現したいこと
VB.NETにて文字と画像を含む帳票をPDF出力するプログラムを組んでいます。

帳票に使う画像ファイルはPNG画像ファイルをVB.NET上で合成して一度ローカルにPNG画像として
保存したものをSVFにてPDF出力しています。

###発生している問題・エラーメッセージ
出力結果のPDFに表示されているPNG画像の透過部分と思われる場所が黒くなってしまいます。
透過部分が黒くなるのを回避するために、合成後の画像ファイルをJPEG形式で保存して回避しようと
考えているのですが、JPEG保存した時点で背景が黒くなってしまいます。
JPEG保存時に透過部分を白として保存する方法、またはPNG形式のままの透過部分を白として
保存する方法はありますでしょうか。

画像を合成して保存しているコードは下記の通りです。

###ソースコード

VB.NET

1'画像合成プロシージャ 2Private Sub graphicChange() 3 4 '背景画像の取り込み 5 Dim baseImage As Image = New Bitmap("背景となる白い画像.png") 6 Dim wirePic As Graphics = Graphics.FromImage(baseImage) 7 8 '画像1書き込み 9 Dim wireImage As Image = New Bitmap("合成する画像1.png") 10 wirePic.DrawImage(wireImage, New Rectangle(New Point(0, 0), wireImage.Size) _ 11 , 0, 0, wireImage.Width, wireImage.Height, GraphicsUnit.Pixel) 12 wireImage.Dispose() 13 14 '画像2書き込み 15 Dim ringImage As Image = New Bitmap("合成する画像2.png") 16 wirePic.DrawImage(ringImage, New Rectangle(New Point(0, 0), ringImage.Size) _ 17 , 0, 0, ringImage.Width, ringImage.Height, GraphicsUnit.Pixel) 18 ringImage.Dispose() 19 20 '画像3書き込み 21 Dim hookImage As Image = New Bitmap("合成する画像3.png") 22 wirePic.DrawImage(hookImage, New Rectangle(New Point(0, 0), hookImage.Size) _ 23 , 0, 0, hookImage.Width, hookImage.Height, GraphicsUnit.Pixel) 24 hookImage.Dispose() 25 26 'PictureBox(picWire)に表示 27 picWire.Image = baseImage 28 picWire.Invalidate() 29 wirePic.Dispose() 30 31End Sub 32 33'画像保存プロシージャ 34Private Sub pngSave() 35 36 'PictureBox(picWire)の表示イメージを保存 37 picWire.Image.Save("ローカル保存ファイル.png" _ 38 , System.Drawing.Imaging.ImageFormat.Png) 39 40End Sub 41

###補足情報(言語/FW/ツール等のバージョンなど)
開発環境
OS:windows7 pro 64bit
CPU:CORE i5
メモリ:4G

使用ツール
Visual Studio 2013(VS Express 2013 for Desktop)
対象のフレームワーク:.NET Framework 3.5

SVF Java PRODUCTS 9.1

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

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

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

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

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

guest

回答2

0

ベストアンサー

こんにちは。

WindowsFormsで良いのでしょうか。
まずは提示されているコードを試してみましたけど、そのままコピペで背景白のPNGファイルが作成されました。
以下のようにしても背景白のJPGが作成されました。

VB.NET

1'PictureBox(picWire)の表示イメージを保存 2'picWire.Image.Save("ローカル保存ファイル.png" _ 3' , System.Drawing.Imaging.ImageFormat.Png) 4picWire.Image.Save("ローカル保存ファイル.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)

まずは、合成する画像が正しいのか再確認してみてください。(背景画像は白になっているのか、他の画像は透過になっているのか)

次に考えられるのは、.NETの画像処理の多くはGDI+の薄いラッパーですのでOSのバージョン、CPUに依存する可能性はあります。
再現を取ることが必要なのでその辺りの情報も提示してみてはどうでしょうか。
※私はWindows8.1 Pro 64bit, Visual Studio 2013 Professional, VB.NET .NET Framework 4.5 にて試しました。

PDF云々はよく検証してないのですが、その時点の画像保存の話で良いのですよね?

投稿2015/11/12 02:20

Tak1wa

総合スコア4791

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

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

okamu

2015/11/12 04:39

回答ありがとうございます。 画像を保存するまでの工程でミスを発見しました。 合成元画像を確認したところ、画像自体に問題はありませんでした。 しかしながら、画像保存をする前にPictureBoxに初期表示用のダミー画像が 上書きされていることが発見されました。ダミー画像を確認したところ、背景のない 画像が使用されていたため今回の事象が発生したようです。 ありがとうございました。
guest

0

まさか透過色が背景の白になってるとかないですよね?

投稿2015/11/12 01:32

dojikko

総合スコア3939

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

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

okamu

2015/11/12 04:29 編集

回答ありがとうございます。 VB上では明示的に透過色の指定は行っていないので、画像ファイルの製作者に確認をしてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問