ページ 11

C# 画像のロードについて

Posted: 2012年7月21日(土) 19:48
by 33tree
ボタンを押した時にいちいち画像をロードするのは良くないので最初にロードしようとしました。
下記のようにしたのですが
Bitmap pic1 = new Bitmap("c:\\背景.bmp");

Bitmap pic2 = new Bitmap("c:\\キャラクター.png");
と同じ所に移動すると実行した時にエラーになります。
どのようにしたらいいですか。

コード:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

// 透明色が指定されたキャラクター画像と、背景画像とを合成するサンプルプログラム
namespace ComposePNGImage
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private float ang = 0;
        private float height = 0;
        Bitmap pic2 = new Bitmap("c:\\キャラクター.png");
        
        
        //============
        // 初期化処理
        private void Form1_Load(object sender, EventArgs e)
        {
            pictureBox1.SizeMode = PictureBoxSizeMode.CenterImage;
            button1.Text = "角度";
            button2.Text = "上下";
        }

        //============
        // 背景画像の上にキャラクター画像が合成された画像を表示
        private void button1_Click_1(object sender, EventArgs e)
        {
            ang++;
            Bitmap pic1 = new Bitmap("c:\\背景.bmp");
            Bitmap resultPic = new Bitmap(AttitudeBitmap(pic1, ang, 100, 382, 0, (int)height));//背景.jpgの中心座標を指定
            Graphics g = Graphics.FromImage(resultPic);
            g.DrawImage(pic2, 26, 306, pic2.Width, pic2.Height);
            g.Dispose();
            pic1.Dispose();
            //pic2.Dispose();
            pictureBox1.Image = resultPic;
        }

        /// <summary>
        /// ビットマップ(Bitmap)を回転する
        /// </summary>
        /// <param name="bmp">ビットマップ</param>
        /// <param name="angle">回転角度</param>
        /// <param name="x">中心点X</param>
        /// <param name="y">中心点Y</param>
        /// <returns></returns>
        public Bitmap AttitudeBitmap(Bitmap bmp, float angle, int x, int y, int s_x, int s_y)
        {
            Bitmap bmp2 = new Bitmap((int)bmp.Width, (int)bmp.Height);
            Graphics g = Graphics.FromImage(bmp2);
            g.Clear(Color.Black);

            g.TranslateTransform(-x, -y);
            g.RotateTransform(angle, System.Drawing.Drawing2D.MatrixOrder.Append);
            g.TranslateTransform(x, y, System.Drawing.Drawing2D.MatrixOrder.Append);
            g.TranslateTransform(s_x, s_y);
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBilinear;

            Rectangle targetRect = new Rectangle(0, 0, bmp.Width, bmp.Height);//ピクセル等倍で描画するための四角形領域作成
            //g.DrawImageUnscaled(bmp, 0, 0);
            g.DrawImage(bmp, targetRect, targetRect, GraphicsUnit.Pixel);//元の画像サイズと同じサイズの四角形領域に合わせて描画する
            g.Dispose();

            return bmp2;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            height++ ;
            if (height == 300) { height = -300; }
            Bitmap pic1 = new Bitmap("c:\\背景.bmp");
            Bitmap pic2 = new Bitmap("c:\\キャラクター.png");
            Bitmap resultPic = new Bitmap(AttitudeBitmap(pic1, ang, (int)pic1.Width / 2, (int)pic1.Height / 2, 0, (int)height));//背景.jpgの中心座標を指定
            Graphics g = Graphics.FromImage(resultPic);
            g.DrawImage(pic2, 26, 306, pic2.Width, pic2.Height);
            g.Dispose();
            pic1.Dispose();
            //pic2.Dispose();
            pictureBox1.Image = resultPic;
        }

    }
}

Re: C# 画像のロードについて

Posted: 2012年7月21日(土) 19:49
by 33tree

Re: C# 画像のロードについて

Posted: 2012年7月21日(土) 20:22
by softya(ソフト屋)
どんなエラーが出るのでしょう。一番重要な情報です。

Re: C# 画像のロードについて

Posted: 2012年7月22日(日) 00:32
by へにっくす
Bitmap pic1 = new Bitmap("c:\\背景.bmp");
この一行を移動しただけでは不十分ですね。
なぜか?button1_clickを実行した時点で
Disposeされ解放しちゃうからです。
もう一度button1_clickが実行されちゃうと、
すでに解放済みのpic1をまた使うことになるわけだから、、

いやそんなはずないと思うなら
エラーが出た時のコードを貼り付けてください。
そして
どんなエラーが出るかも掲示してくださいね。
オフトピック
pic1、pic2をメソッドの外に出したいなら
button2_clickも変更する必要があるね

Re: C# 画像のロードについて

Posted: 2012年7月22日(日) 15:28
by 33tree
フェニックスさんのとうりでした。
ありがとうございました。

Re: C# 画像のロードについて

Posted: 2012年7月22日(日) 15:30
by asd
33tree さんが書きました:フェニックスさんのとうりでした。
ありがとうございました。
どんなエラーが出ていて、どのように解決したのかがさっぱりわかりません。
どのようなエラーが出ていて、最終的なコードがどうなったのかの提示をお願いします。