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

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

新規登録して質問してみよう
ただいま回答率
85.35%
C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

2回答

5446閲覧

C#画像を透過させたいです。

kai1987

総合スコア2

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2021/04/18 00:18

編集2021/04/18 03:57

初めまして、C#を勉強しているのですが
どうしてもわからなく、こちらに投稿させて頂きます。

※追記 
・開発環境
OS Windows
Visual Studio 2019
NET Framework4.7.2 (C#)

・やりたいこと
画像(png)を透過させたいです。

・現状

VisulastudioでC#を学習しています。
学習を目的とした簡単なゲームを作ろうとしていますが、
画像がすべて透過してしまい。アルファー箇所のみの透過出来ず困っています。

素材は、pngです。

・試したこと

以下を試したのですが、pictureBox2が表示されません。

public partial class Form1 : Form { public Form1() { InitializeComponent(); pictureBox2.Parent = pictureBox1; pictureBox2.BackColor = Color.Transparent; }

お手数をお掛けいたしますが、アドバイスを頂ければ幸いです。
宜しくお願い致します。

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

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

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

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

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

Hey_CH

2021/04/18 01:15

コードを見た感じ、pictureBox2にPNGを表示したいのかな?と思ったのですが、画像を表示するコードを書いてないのは何か意図があるのでしょうか? pictureBox2に表示したいわけではない、という事であれば、どのようにしたいかを具体的に記載してください。
退会済みユーザー

退会済みユーザー

2021/04/18 01:41 編集

> 画像(Ping)を透過させたいです。 png の間違いであれば質問欄は編集できるので訂正願います。 開発環境を質問欄に追記願います。OS, Visual Studio のバージョン、.NET Framework か Core のどちらなのかとそのバージョンなど。
kai1987

2021/04/18 01:52

Hey_CHさん、SurferOnWwwさん ありがとうございます。 まずSurferOnWwwさんのご指摘頂いた質問を訂正させて頂きます。
kai1987

2021/04/18 02:02

質問を変更致しました。 質問に関する仕方を、教えて頂きありがとうございました。 次回から、気を付けるように致します。 他にも至らない点がありましたらご指摘頂ければ幸いです。 宜しくお願い致します。
退会済みユーザー

退会済みユーザー

2021/04/18 04:06

「picturebox png 透過」などをキーワードにググると参考になりそうな記事がいろいろヒットすると思うのですが、やってみましたか? たとえば下記: 重なったPictureBoxの透過方法 https://teratail.com/questions/163912
kai1987

2021/04/18 04:44 編集

そうですね。いくつか、、質問投げる前に検索はしてみたのですが、上手く行きませんでした。 こちらがやりたい事に近かったので、参考に真似してみたのですが、上手く行きませんでした。 https://www.youtube.com/watch?v=KTHHVPqcbh0 環境や設定、または描画する素材に問題があるのかもと思いました。 ひとまず参考に頂いたリンクを試してみます。 ありがとうございます。
kai1987

2021/04/18 05:27 編集

SurferOnWww さん ありがとうございます。 どうやら私の認識が間違っていたみたいです。。 ・出来ると思っていた事(勘違い) PNG素材をアルファにできる。AとBの絵が交わる時アルファ箇所が透過される。 ・結果(わかった事) 1枚の絵の上に表示され、なおかつアルファ値が透過される。 そもそも、自分の認識が間違っていたようです。。 ・動画にやりたかったけど、できなかった事。わかった事をチャプターにしました。 https://youtu.be/6wtO4grGMpQ また改めて質問を投稿させて頂こうかと思います。 ありがとうございました。
退会済みユーザー

退会済みユーザー

2021/04/19 00:31

動画をアップするより、なるべく質問で画像・文章で簡潔に伝える努力をしてみてください。動画の確認自体も時間が掛かりますし、ここは情報共有サイトでもあるので。動画に質問の詳細を投げると、データベースとしての価値が下がります。
kai1987

2021/04/24 09:26 編集

radian様 返信遅くなり申し訳ございません。 いろいろアドバイスありがとうございます。 文章で簡潔にできるように気を付けます。
guest

回答2

0

ベストアンサー

ゲーム的な透過が必要なら、どうしてもWindows Formsじゃないといけないという制約が無いなら、WPFで作成した方がいいです。(はっきりいって用途的に不向きなので)
アルファも考慮して描画してくれますし、回転や半透明も簡単に出来ます。

C#

1using System; 2using System.Windows; 3using System.Windows.Media; 4using System.Windows.Media.Imaging; 5 6namespace WpfApp1 7{ 8 public partial class MainWindow : Window 9 { 10 public MainWindow() 11 { 12 InitializeComponent(); 13 } 14 15 private void Window_Loaded(object sender, RoutedEventArgs e) 16 { 17 image1.Source = new BitmapImage(new Uri(@"c:\test\skydiving_instructor.png")); 18 image2.Source = new BitmapImage(new Uri(@"c:\test\sports_volleyball_woman_recieve.png")); 19 image2.Opacity = 0.5; //50%半透明 20 var transGroup = new TransformGroup(); 21 var rot = new RotateTransform(30.0); //30度回転 22 transGroup.Children.Add(rot); 23 image2.RenderTransform = transGroup; 24 } 25 } 26}

サンプル

投稿2021/04/19 01:23

編集2021/04/19 01:45
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

とりあえず、それっぽく動いてるような気がしたので、回答として書いておきます。
Windowsフォームアプリケーションで、ゲームを作るのが主な目的なら、「C# Windows Forms game」等で検索すると良いと思います。

PictureBox的なオブジェクトをどうしても使いたい場合(重い)

C#

1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Runtime.InteropServices; 8using System.Text; 9using System.Threading.Tasks; 10using System.Windows.Forms; 11 12namespace TeraPNGTransparent { 13 public partial class Form1 : Form { 14 15 PictureBoxEx[] pictureBoxs; 16 PictureBoxEx pictureBoxN; 17 18 public Form1() { 19 InitializeComponent(); 20 21 this.BackColor = Color.Red; 22 this.MouseDown += (s, e) => {//左右クリックで移動 23 if (e.Button == MouseButtons.Left) pictureBoxN.Left += 50; 24 else pictureBoxN.Left -= 50; 25 }; 26 27 pictureBoxs = new PictureBoxEx[5];//3個程度でも結構重い 28 29 for (int i = 0; i < pictureBoxs.Length; i++) { 30 pictureBoxs[i] = new PictureBoxEx(); 31 pictureBoxs[i].Location = new Point(50 * i, 0); 32 pictureBoxs[i].Size = new Size(257, 300);//画像と同じサイズ(じゃなくても良い) 33 pictureBoxs[i].ImageLocation = @"aaa.png"; 34 pictureBoxs[i].BackColor = Color.Transparent; 35 pictureBoxs[i].Name = "pictureBox" + (i + 1); 36 } 37 38 pictureBoxN = new PictureBoxEx(); 39 pictureBoxN.Location = new Point(70, 70); 40 pictureBoxN.Size = new Size(197, 300);//画像と同じサイズ(じゃなくても良い) 41 pictureBoxN.ImageLocation = @"bbb.png"; 42 pictureBoxN.BackColor = Color.Transparent; 43 pictureBoxN.Name = "pictureBoxN"; 44 45 foreach (var px in pictureBoxs) this.Controls.Add(px); 46 this.Controls.Add(pictureBoxN);//先に追加した方が上になる 47 } 48 } 49 50 51 public class PictureBoxEx : PictureBox { 52 protected override void OnMove(EventArgs e) { 53 base.OnMove(e); 54 if (Parent != null) { 55 Parent.Invalidate(); 56 } 57 } 58 //https://stackoverflow.com/questions/36710701/make-picture-boxes-transparent-each-overlapping-the-other-with-a-corner 59 protected override void OnPaintBackground(PaintEventArgs pe) { 60 base.OnPaintBackground(pe); 61 Graphics g = pe.Graphics; 62 if (this.Parent != null) { 63 var index = Parent.Controls.GetChildIndex(this); 64 for (var i = Parent.Controls.Count - 1; i > index; i--) { 65 var c = Parent.Controls[i]; 66 if (c.Bounds.IntersectsWith(Bounds) && c.Visible) { 67 using (var bmp = new Bitmap(c.Width, c.Height, g)) { 68 c.DrawToBitmap(bmp, c.ClientRectangle);//これを使うとOnPaintBackgroundが呼ばれる。困る。 69 g.DrawImageUnscaled(bmp, new Point(c.Left - Left, c.Top - Top)); 70 } 71 } 72 } 73 } 74 } 75 } 76}

Formに描画する場合

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 TeraPNGTransparent2 { 12 public partial class Form1 : Form { 13 Point[] picturePoss; 14 Point picturePosN; 15 Bitmap[] pictures; 16 Bitmap pictureN; 17 18 public Form1() { 19 InitializeComponent(); 20 21 this.BackColor = Color.Red; 22 this.DoubleBuffered = true; 23 this.MouseDown += (s, e) => {//左右クリックで移動 24 if (e.Button == MouseButtons.Left) picturePosN.X += 50; 25 else picturePosN.X -= 50; 26 Invalidate();//再描画 27 }; 28 this.Paint += Form1_Paint; 29 Graphics g = this.CreateGraphics(); 30 31 picturePoss = new Point[5]; 32 pictures = new Bitmap[picturePoss.Length]; 33 for (int i = 0; i < picturePoss.Length; i++) { 34 picturePoss[i] = new Point(50 * i, 0); 35 pictures[i] = new Bitmap(@"aaa.png"); 36 pictures[i].SetResolution(g.DpiX, g.DpiY);//解像度が違う場合必要 37 } 38 picturePosN = new Point(70, 70); 39 pictureN = new Bitmap(@"bbb.png"); 40 pictureN.SetResolution(g.DpiX, g.DpiY);//解像度が違う場合必要 41 } 42 43 private void Form1_Paint(object sender, PaintEventArgs e) { 44 var g = e.Graphics; 45 46 g.DrawImageUnscaled(pictureN, new Rectangle(picturePosN, pictureN.Size)); 47 48 for (int i = picturePoss.Length - 1; i >= 0; i--) g.DrawImageUnscaled(pictures[i], new Rectangle(picturePoss[i], pictures[i].Size)); 49 } 50 } 51} 52

投稿2021/04/18 16:12

Hey_CH

総合スコア437

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問