🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

892閲覧

C#で2つの画像が正しく合成されない場合がある

lap

総合スコア4

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2021/02/20 14:59

編集2021/02/20 22:07

前提・実現したいこと

C#で2つの画像を正しく合成したい

発生している問題・エラーメッセージ

2つの画像をドラッグ&ドロップして左右に合成されるプログラムを製作。
大抵の画像データは正しく合成されるが一部データは正しく合成されない。
合成画像に黒い部分が出てしまう。

該当のソースコード

c#

1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Threading.Tasks; 9using System.Windows.Forms; 10 11namespace WindowsFormsApp1 12{ 13 public partial class Form1 : Form 14 { 15 public Form1() 16 { 17 InitializeComponent(); 18 } 19 20 private void label1_DragDrop(object sender, DragEventArgs e) 21 { 22 string[] files = (string[])e.Data.GetData(DataFormats.FileDrop, false); 23 if (files.Count() < 2) return; 24 Bitmap left = new Bitmap(files[0]); 25 Bitmap right = new Bitmap(files[1]); 26 Bitmap synthesis = new Bitmap(left.Width + right.Width, left.Height); 27 28 // 画像を合成 29 Graphics g = Graphics.FromImage(synthesis); 30 g.DrawImage(left, new Point(0, 0)); 31 g.DrawImage(right, new Point(left.Width, 0)); 32 g.Dispose(); 33 left.Dispose(); 34 right.Dispose(); 35 36 string dir = System.IO.Path.GetDirectoryName(files[0]); 37 string file = dir + "\C"; 38 string ext = System.IO.Path.GetExtension(files[0]); 39 40 if (ext == ".jpg" || ext == ".jpeg") 41 synthesis.Save(file + ext, System.Drawing.Imaging.ImageFormat.Jpeg); 42 else 43 synthesis.Save(file + ext, System.Drawing.Imaging.ImageFormat.Png); 44 45 } 46 47 private void label1_DragEnter(object sender, DragEventArgs e) 48 { 49 if (e.Data.GetDataPresent(DataFormats.FileDrop)) e.Effect = DragDropEffects.All; 50 else e.Effect = DragDropEffects.None; 51 } 52 } 53} 54

試したこと

上記ソースコードはlabel1を貼り付けてAllowDropプロパティをtrue、DragDrop、DragEnterイベントを追加したものです。

Bitmap synthesis = new Bitmap(left.Width + right.Width, left.Height);
までは正しく動作していることを確認しました。
// 画像を合成
Graphics g = Graphics.FromImage(synthesis);
g.DrawImage(left, new Point(0, 0));
g.DrawImage(right, new Point(left.Width, 0));
に問題があるのだと思うのですが原因が分かりません。

参考にしたサイト

補足情報

画像データに問題があると思いますので問題の画像データをアップします。
A.jpgとB.jpgを合成するとC.jpgができます。
A.jpg
イメージ説明
B.jpg
イメージ説明
C.jpg
イメージ説明

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

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

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

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

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

Y.H.

2021/02/20 15:03

> 大抵の画像データは正しく合成されるが一部データは正しく合成されない。 どういう結果になるのが正しくて、どういう結果になるのが正しくないとlapさんは考えているのですか? それが記載されていないと誰にも回答できないと思いますよ。
lap

2021/02/20 15:18

黒い部分が表示されてしまいます。 C.jpgの黒い部分無しで合成したいです。
Y.H.

2021/02/20 15:21

それは質問本文に記載しましょう。
guest

回答1

0

ベストアンサー

出力時のサイズを指定してないから自動スケーリングされてるのかもしれません。
これだとどうですかね。

C#

1g.DrawImage(left, 0, 0, left.Width, left.Height); 2g.DrawImage(right, left.Width, 0, right.Width, right.Height);

投稿2021/02/20 16:10

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

lap

2021/02/20 16:20

上記コードに変更したところ正しく合成されました! 自動スケーリング・・・そんなのがあるんですね~。 回答ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問