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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
33tree

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

#1

投稿記事 by 33tree » 13年前

ボタンを押した時にいちいち画像をロードするのは良くないので最初にロードしようとしました。
下記のようにしたのですが
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;
        }

    }
}


アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#3

投稿記事 by softya(ソフト屋) » 13年前

どんなエラーが出るのでしょう。一番重要な情報です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

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

#4

投稿記事 by へにっくす » 13年前

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

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

33tree

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

#5

投稿記事 by 33tree » 13年前

フェニックスさんのとうりでした。
ありがとうございました。

アバター
asd
記事: 319
登録日時: 15年前

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

#6

投稿記事 by asd » 13年前

33tree さんが書きました:フェニックスさんのとうりでした。
ありがとうございました。
どんなエラーが出ていて、どのように解決したのかがさっぱりわかりません。
どのようなエラーが出ていて、最終的なコードがどうなったのかの提示をお願いします。
Advanced Supporting Developer
無理やりこじつけ(ぉ

閉鎖

“C言語何でも質問掲示板” へ戻る