C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[9]: 画像合成が実行できなくて困っています。


(過去ログ 45 を表示中)

[トピック内 21 記事 (1 - 20 表示)]  << 0 | 1 >>

■23984 / inTopicNo.1)  画像合成が実行できなくて困っています。
  
□投稿者/ 裕猫 (3回)-(2008/08/26(Tue) 09:54:30)

分類:[.NET 全般] 

こんにちは C#でプログラムを作っています。form1の背景にキャラクター画像を透過合成しようとしていますが、ビルドは正常に終了しますが、実行すると背景だけでキャラクターが表示されません。どこが悪いのでしょうか?おわかりの方いらっしゃいましたら、ご教授ください。よろしくお願いいたします。
コードform1
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Text;
using System.Windows.Forms;

namespace KURASU2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
this.BackgroundImage = Properties.Resources.bg01;
this.bkLoad(@"G:\\キャラクターCG\\NScripter\\メイド\\m01.bmp");
}

public void bkLoad(String k)
{
Bitmap bmp = new Bitmap(k);
Graphics g = CreateGraphics();
bmp.MakeTransparent(System.Drawing.Color.White);
Rectangle rect = new Rectangle(bmp.Width / 2, 0, 639, bmp.Height);
g.DrawImage(bmp, 300, 479 - bmp.Height, rect, GraphicsUnit.Pixel);
}

}
}

引用返信 編集キー/
■23985 / inTopicNo.2)  Re[1]: 画像合成が実行できなくて困っています。
□投稿者/ 鶏唐揚 (288回)-(2008/08/26(Tue) 10:26:26)
描画処理は通常Paintイベントに書きます。

なぜなら1回描画してそれっきりでは他フォームが乗ったり隠れたりしたとき消えるからです。
引用返信 編集キー/
■23989 / inTopicNo.3)  Re[2]: 画像合成が実行できなくて困っています。
□投稿者/ 裕猫 (4回)-(2008/08/26(Tue) 11:05:58)
No23985 (鶏唐揚 さん) に返信
> 描画処理は通常Paintイベントに書きます。
>
早速の返信ありがとうございます。Paintイベントですか。まだC#始めたばかりなのでその辺まで到達していないのですが、これから調べてみます。貴重なアドバイスありがとうございました。
引用返信 編集キー/
■23998 / inTopicNo.4)  Re[2]: 画像合成が実行できなくて困っています。
□投稿者/ 便乗マン「 (1回)-(2008/08/26(Tue) 14:14:17)
No23985 (鶏唐揚 さん) に返信
> 描画処理は通常Paintイベントに書きます。
> 
> なぜなら1回描画してそれっきりでは他フォームが乗ったり隠れたりしたとき消えるからです。

失礼ながら私も勉強させていただきます。
 private void Form1_Paint(object sender, PaintEventArgs e)に書いてみました。
キャラクターは描画されますが、ちらつきがおこります。
なぜなのでしょうか?

引用返信 編集キー/
■24000 / inTopicNo.5)  Re[3]: 画像合成が実行できなくて困っています。
□投稿者/ 鶏唐揚 (290回)-(2008/08/26(Tue) 14:30:07)
No23998 (便乗マン「 さん) に返信
> private void Form1_Paint(object sender, PaintEventArgs e)に書いてみました。
> キャラクターは描画されますが、ちらつきがおこります。
> なぜなのでしょうか?
Paintイベントに書かなければならない理由を考えれば自ずと答えは出てきます。

Paintイベントは、画面を書き直す必要がある際に発生するイベントです。
そしてPaintイベントで描画処理を行わなければならない理由が、
>>>他フォームが乗ったり隠れたりしたとき消えるから
です。

となれば、消える→書く→消える→書く の連続となるため、ちらつきます。
回避するには「ダブルバッファリング」で調べてみてください。
引用返信 編集キー/
■24002 / inTopicNo.6)  Re[4]: 画像合成が実行できなくて困っています。
□投稿者/ PATIO (102回)-(2008/08/26(Tue) 14:58:02)
2008/08/26(Tue) 14:58:34 編集(投稿者)

No24000 (鶏唐揚 さん) に返信
> となれば、消える→書く→消える→書く の連続となるため、ちらつきます。
> 回避するには「ダブルバッファリング」で調べてみてください。

ちょっと補足。
通常の画面描画に関して言うなら、
更新すべき範囲を一度背景色で塗潰し(ここが消えるの部分)、
その後、指定された手順で更新領域を書き直す。(ここが書くの部分)
これの繰り返しになります。
直接変化が無い部分でも更新する範囲は、
一旦、背景色で塗潰されてしまうので消えて、
出てくる事になります。(=チラつく。)
何もかもを背景色で塗潰すという処理をやめて、
必要な部分を必要な色で毎回書くだけにすると
見た目のチラつきは緩和されますが、
塗潰す形状が複雑になると塗潰しに時間が掛かるので
これはこれで問題です。
あと、描画遅い為に書いている途中経過が見えているのも
チラつきの原因になります。

既にあげられているダブルバッファリングは、
直接画面に書くのではなくてメモリ上で全体の画像を作成して
出来た画像を画面に貼るというイメージなので、
書き換える途中経過が見えなくなり、チラつきが抑えられます。
また、メモリ上で画像を作成するので直接画面に描画するよりも
高速に描画をする事が出来ます。
高速描画の常套手段になりますので良く理解しておくと良いと思います。

引用返信 編集キー/
■24024 / inTopicNo.7)  Re[5]: 画像合成が実行できなくて困っています。
□投稿者/ 清水目 (1回)-(2008/08/26(Tue) 19:30:23)
No24002 (PATIO さん) に返信
> 2008/08/26(Tue) 14:58:34 編集(投稿者)
>
> ■No24000 (鶏唐揚 さん) に返信
>>となれば、消える→書く→消える→書く の連続となるため、ちらつきます。
>>回避するには「ダブルバッファリング」で調べてみてください。
>
> ちょっと補足。
> 通常の画面描画に関して言うなら、
> 更新すべき範囲を一度背景色で塗潰し(ここが消えるの部分)、
> その後、指定された手順で更新領域を書き直す。(ここが書くの部分)
> これの繰り返しになります。
> 直接変化が無い部分でも更新する範囲は、
> 一旦、背景色で塗潰されてしまうので消えて、
> 出てくる事になります。(=チラつく。)
> 何もかもを背景色で塗潰すという処理をやめて、
> 必要な部分を必要な色で毎回書くだけにすると
> 見た目のチラつきは緩和されますが、
> 塗潰す形状が複雑になると塗潰しに時間が掛かるので
> これはこれで問題です。
> あと、描画遅い為に書いている途中経過が見えているのも
> チラつきの原因になります。
>
> 既にあげられているダブルバッファリングは、
> 直接画面に書くのではなくてメモリ上で全体の画像を作成して
> 出来た画像を画面に貼るというイメージなので、
> 書き換える途中経過が見えなくなり、チラつきが抑えられます。
> また、メモリ上で画像を作成するので直接画面に描画するよりも
> 高速に描画をする事が出来ます。
> 高速描画の常套手段になりますので良く理解しておくと良いと思います。
>

回答ではありませんが、こうした画像を透過合成する処理については、C#もVBも
かなり面倒ですよね。
HSPなどの言語では、同じことをするのに数行の処理ですませることができます。
グラフィック関係やゲームなどはC#などでもできないことはないですが、
それほど高度なレベルをめざさないのなら他の軽量言語を使用したほうが生産性
は高いと思われます。もっとも、C#言語を学ぶことが目的ならば話は別ですが、

引用返信 編集キー/
■24044 / inTopicNo.8)  Re[3]: 画像合成が実行できなくて困っています。
□投稿者/ 紅の豚118 (10回)-(2008/08/27(Wed) 07:54:02)
No23989 (裕猫 さん) に返信
> ■No23985 (鶏唐揚 さん) に返信
>>描画処理は通常Paintイベントに書きます。
>>
> 早速の返信ありがとうございます。Paintイベントですか。まだC#始めたばかりなのでその辺まで到達していないのですが、これから調べてみます。貴重なアドバイスありがとうございました。

私も最近描画系の勉強をしてまして、参考になったところをリンクします。
リンク先の記事と、下のほうにある「この記事と関連性の高い別の.NET TIPS」の内容を追えば、理解も深まると思います。
【ダブル・バッファリングにより描画を行うには?】
http://www.atmarkit.co.jp/fdotnet/dotnettips/197doublebuf/doublebuf.html
引用返信 編集キー/
■24046 / inTopicNo.9)  Re[3]: 画像合成が実行できなくて困っています。
□投稿者/ 便乗マン「 (3回)-(2008/08/27(Wed) 09:30:18)
No23998 (便乗マン「 さん) に返信
> ■No23985 (鶏唐揚 さん) に返信
>>描画処理は通常Paintイベントに書きます。
>>
>>なぜなら1回描画してそれっきりでは他フォームが乗ったり隠れたりしたとき消えるからです。
>
> 失礼ながら私も勉強させていただきます。
> private void Form1_Paint(object sender, PaintEventArgs e)に書いてみました。
> キャラクターは描画されますが、ちらつきがおこります。
> なぜなのでしょうか?

pictureBoxに画像を読み込むようにするとちらつきはなくなりましたが、
指定した色を透過できません。

private void Form1_Load(object sender, EventArgs e)
{
//画像の読み込み
Bitmap bmp = new Bitmap(pictureBox1.Width,pictureBox1.Height);
//黒を透明色とする
bmp.MakeTransparent(Color.Black);
pictureBox1.Image = bmp;

Graphics g = Graphics.FromImage(pictureBox1.Image);
Image img = Image.FromFile("c:\\2.jpg");
g.DrawImage(img, 0, 0);
img.Dispose();

g.Dispose();

}
引用返信 編集キー/
■24049 / inTopicNo.10)  Re[5]: 画像合成が実行できなくて困っています。
□投稿者/ シャノン (590回)-(2008/08/27(Wed) 10:03:12)
No24002 (PATIO さん) に返信

もちょっと補足すると、再描画すべき領域全体を Paint イベントで描くのなら、それに先立って消す(背景色で塗りつぶす)必要もありません。
どうせ自分で全体を上書きしてしまうのですから。
そういう場合は、背景色で塗りつぶす処理を行わないようにするというのも、ちらつきを消す常套手段の一つですね。
Windows Forms では、Control.OnPaintBackground をオーバーライドすれば可能です。
引用返信 編集キー/
■24050 / inTopicNo.11)  Re[4]: 画像合成が実行できなくて困っています。
□投稿者/ シャノン (591回)-(2008/08/27(Wed) 10:15:02)
No24046 (便乗マン「 さん) に返信
> pictureBoxに画像を読み込むようにするとちらつきはなくなりましたが、
> 指定した色を透過できません。

なんか、何をやってるのかよくわかんないコードになってしまっていますが…
各行の意図を説明できますか?

ひょっとして、やりたいことは、2.jpg の黒い部分を透過させて PictureBox に描画したいということでしょうか?
であれば、MakeTransparent が 2.jpg に対して呼ばれていませんので、透過しないのは当然かと。

new Bitmap( "2.jpg" ) で作った Bitmap に対して MakeTransparent してから PictureBox.Image にセットするとどうなりますかね?

ところで、jpeg って透過処理には向かない気がしますが。

> private void Form1_Load(object sender, EventArgs e)
> {
> //画像の読み込み
> Bitmap bmp = new Bitmap(pictureBox1.Width,pictureBox1.Height);
> //黒を透明色とする
> bmp.MakeTransparent(Color.Black);
> pictureBox1.Image = bmp;
>
> Graphics g = Graphics.FromImage(pictureBox1.Image);
> Image img = Image.FromFile("c:\\2.jpg");
> g.DrawImage(img, 0, 0);
> img.Dispose();
>
> g.Dispose();
>
> }


引用返信 編集キー/
■24062 / inTopicNo.12)  Re[5]: 画像合成が実行できなくて困っています。
□投稿者/ 便乗マン「 (4回)-(2008/08/27(Wed) 12:45:38)
No24050 (シャノン さん) に返信
> ■No24046 (便乗マン「 さん) に返信
>>pictureBoxに画像を読み込むようにするとちらつきはなくなりましたが、
>>指定した色を透過できません。
> 
> なんか、何をやってるのかよくわかんないコードになってしまっていますが…
> 各行の意図を説明できますか?
> 
> ひょっとして、やりたいことは、2.jpg の黒い部分を透過させて PictureBox に描画したいということでしょうか?
> であれば、MakeTransparent が 2.jpg に対して呼ばれていませんので、透過しないのは当然かと。
> 
> new Bitmap( "2.jpg" ) で作った Bitmap に対して MakeTransparent してから PictureBox.Image にセットするとどうなりますかね?
> 
> ところで、jpeg って透過処理には向かない気がしますが。

> 
これでも透過できません。 
 private void Form1_Load(object sender, EventArgs e)
        {
            //画像の読み込み
            Bitmap bmp = new Bitmap("c:\\2.gif");
            //白を透明色とする"c:\\2.gif"
            bmp.MakeTransparent(Color.White);
            pictureBox1.Image = bmp;
                                   
            Graphics g = Graphics.FromImage(pictureBox1.Image);
            
            g.DrawImage(pictureBox1.Image, 0, 0);
           
            g.Dispose();
            
        }

引用返信 編集キー/
■24071 / inTopicNo.13)  Re[6]: 画像合成が実行できなくて困っています。
□投稿者/ 便乗マン」 (1回)-(2008/08/27(Wed) 14:03:22)
2008/08/27(Wed) 14:05:49 編集(投稿者)
2008/08/27(Wed) 14:04:14 編集(投稿者)

基礎的な質問ですが、pictureBoxコントロールを2つ重ねた場合に
前面の画像(pictureBox1)を透過処理した場合、下の画像(pictureBox2)が透過して見えるのでしょうか?
引用返信 編集キー/
■24074 / inTopicNo.14)  Re[7]: 画像合成が実行できなくて困っています。
□投稿者/ 便乗マン」 (2回)-(2008/08/27(Wed) 14:32:03)
No24071 (便乗マン」 さん) に返信
> 2008/08/27(Wed) 14:05:49 編集(投稿者)
> 2008/08/27(Wed) 14:04:14 編集(投稿者)
>
> 基礎的な質問ですが、pictureBoxコントロールを2つ重ねた場合に
> 前面の画像(pictureBox1)を透過処理した場合、下の画像(pictureBox2)が透過して見えるのでしょうか?

これは無理のようですね。そのような仕様なのでしょう。
引用返信 編集キー/
■24078 / inTopicNo.15)  Re[4]: 画像合成が実行できなくて困っています。
□投稿者/ 裕猫 (5回)-(2008/08/27(Wed) 14:46:36)
> 【ダブル・バッファリングにより描画を行うには?】
> http://www.atmarkit.co.jp/fdotnet/dotnettips/197doublebuf/doublebuf.html

リンク先ありがとうございます。大変参考になります。またいいところ有ったら教えてください。
引用返信 編集キー/
■24080 / inTopicNo.16)  Re[8]: 画像合成が実行できなくて困っています。
□投稿者/ れい (755回)-(2008/08/27(Wed) 14:51:53)
No24074 (便乗マン」 さん) に返信
> ■No24071 (便乗マン」 さん) に返信
>>2008/08/27(Wed) 14:05:49 編集(投稿者)
>>2008/08/27(Wed) 14:04:14 編集(投稿者)
>>
>>基礎的な質問ですが、pictureBoxコントロールを2つ重ねた場合に
>>前面の画像(pictureBox1)を透過処理した場合、下の画像(pictureBox2)が透過して見えるのでしょうか?
>
> これは無理のようですね。そのような仕様なのでしょう。

そんなこと無いと思いますよ。
2枚でも3枚でも、きちんと透過してます。
引用返信 編集キー/
■24082 / inTopicNo.17)  Re[4]: 画像合成が実行できなくて困っています。
□投稿者/ 裕猫 (6回)-(2008/08/27(Wed) 14:55:28)
> private void Form1_Load(object sender, EventArgs e)
> {
> //画像の読み込み
> Bitmap bmp = new Bitmap(pictureBox1.Width,pictureBox1.Height);
> //黒を透明色とする
> bmp.MakeTransparent(Color.Black);
> pictureBox1.Image = bmp;
>
> Graphics g = Graphics.FromImage(pictureBox1.Image);
> Image img = Image.FromFile("c:\\2.jpg");
> g.DrawImage(img, 0, 0);
> img.Dispose();
>
> g.Dispose();
>
> }

これわたしもやりました。なぜ合成できないんでしょうね。でもボタンを作って
ボタン1
private void button1_Click(object sender, EventArgs e)
{
this.BackgroundImage = Properties.Resources.bg01;
}
ボタン2
private void button2_Click(object sender, EventArgs e)
{
Bitmap bmp = new Bitmap(@"G:\キャラクターCG\NScripter\メイド\M01.bmp");
bmp.MakeTransparent(System.Drawing.Color.Black);
Graphics g = CreateGraphics();
Rectangle rect = new Rectangle(0, 0, bmp.Width / 2 - 1, bmp.Height);
g.DrawImage(bmp, 300, 479 - bmp.Height, rect, GraphicsUnit.Pixel);
bmp.Dispose();
}
とすると、ボタンを押せばできるんですよね。でも私の場合、オープニングなどで、ボタンクリックイベント無しでやりたいので考え込んでしまった次第です。
引用返信 編集キー/
■24083 / inTopicNo.18)  Re[6]: 画像合成が実行できなくて困っています。
□投稿者/ シャノン (593回)-(2008/08/27(Wed) 14:57:07)
No24062 (便乗マン「 さん) に返信
> これでも透過できません。

DrawImage する必要あるんですか?
引用返信 編集キー/
■24100 / inTopicNo.19)  Re[7]: 画像合成が実行できなくて困っています。
□投稿者/ 便乗マン」 (3回)-(2008/08/27(Wed) 19:40:45)
No24083 (シャノン さん) に返信
> ■No24062 (便乗マン「 さん) に返信
>>これでも透過できません。 
> 
> DrawImage する必要あるんですか?

必要ないのでしょうか?
参考図書をみながら打ち込んでいるのですが

(visual C# 2005 プログラミングテクニック
応用できる基本の書き方 谷尻かおり著)

#描画系は、いろいろなやり方できるようなので
そのへんが頭の悪い小生にはわかりにくいです。

引用返信 編集キー/
■24116 / inTopicNo.20)  Re[8]: 画像合成が実行できなくて困っています。
 
□投稿者/ ま (114回)-(2008/08/28(Thu) 00:59:53)
PictureBox の背景と前景で合成できませんか?
リアルタイム描画はコレでダメな時で十分なような気がします。


秒間何駒なんよ?

それから、プログラムで透明色を指定するんじゃなくて、透過PNGで作っておいて読み込むだけにしたら?
IrfanView あたりで一括変換できるでしょう。

引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -