C # растровое изображение не отображается на экране - PullRequest
4 голосов
/ 02 сентября 2011

Я пытаюсь написать программу для рисования для планшета. Для этого мне нужно падение и прозрачность для использования с давлениями. Поэтому я использую систему растровых изображений в C # для построения изображений.

Я не могу получить код для рисования, чтобы что-то отобразить Он отображается в графическом окне. Я знаю, что некоторые вещи вводятся в растровое изображение, так как оно появляется, когда я сохраняю растровое изображение.

Я осмотрел почти все вопросы рисования на C #, относящиеся к использованию рисования линий или эллипса, в отличие от растровых изображений

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 paint1
{
    public partial class Form2 : Form
    {
        public Bitmap m_bitmap;
        public bool m_penDown;
        public int m_lastX;
        public int m_lastY;
        public int m_currentX;
        public int m_currentY;

        public Form2()
        {
            InitializeComponent();

            // Create the bitmap area
            m_bitmap = new Bitmap(this.Width, this.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
            m_penDown = false;

            Graphics m_graphics = Graphics.FromImage(m_bitmap);
            m_lastX = System.Windows.Forms.Cursor.Position.X;
            m_lastY = System.Windows.Forms.Cursor.Position.Y;
            m_currentX = System.Windows.Forms.Cursor.Position.X;
            m_currentY = System.Windows.Forms.Cursor.Position.Y;
        }

        private void Form2_Load(object sender, EventArgs e)
        {

        }

        private void Form2_Paint(object sender, PaintEventArgs e)
        {
            Graphics objGraphics;
            //You can't modify e.Graphics directly.
            objGraphics = e.Graphics;
            // Draw the contents of the bitmap on the form.
            objGraphics.DrawImage(m_bitmap, 0, 0,
              m_bitmap.Width,
              m_bitmap.Height);
            objGraphics.Dispose();
        }

        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            m_penDown = true;
        }

        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        {
            m_penDown = false;
        }

        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            m_lastX = m_currentX;
            m_lastY = m_currentY;

            m_currentX = System.Windows.Forms.Cursor.Position.X;
            m_currentY = System.Windows.Forms.Cursor.Position.Y;

            if(m_penDown)
                m_bitmap.SetPixel(m_currentX, m_currentY, Color.Gray);
        }

        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {

            Form2_Paint(sender, e);
            this.pictureBox1.Image = m_bitmap;
        }

        private void Form2_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Space)
            {
                m_bitmap.Save(@"C:\Users\rpettefar\Documents\My Dropbox\Programming\paint1\preview.bmp", System.Drawing.Imaging.ImageFormat.Bmp);
            }
        }
    }
}

Я немного новичок в c #, поэтому я очень открыт для любых других вопросов или вещей, которые могут также привлечь ваше внимание.

Ответы [ 4 ]

2 голосов
/ 02 сентября 2011

Вам нужно будет назначить свое растровое изображение для графического блока.

myPictureBox.Image = m_bitmap;

Это можно сделать после того, как вы изменили растровое изображение или назначите его один раз, а затем сделаете недействительным свой PictureBox.

myPictureBox.Invalidate();

Это говорит вашей форме обновить изображение на экране.Нет необходимости переопределять OnPaint.Нарисуйте растровое изображение, используя объект Graphics, который вы создали в конструкторе формы (если вы хотите сделать более сложные вещи, чем просто рисование отдельных пикселей).PictureBox сделает все остальное.

2 голосов
/ 02 сентября 2011

Похоже, что вы пытаетесь вывести изображение на экран как минимум двумя способами;Я не могу сразу сказать, что не так, но я бы сказал, что определенно избавьтесь от этой строки objGraphics.Dispose(); - вы не создали Graphics (вы ее пропустили), поэтому вы не должны Dispose.

1 голос
/ 02 сентября 2011

Другие авторы в основном ответили на этот вопрос, но по моему опыту я бы добавил, что вы, вероятно, получите некоторое мерцание с этим методом.Если вы это сделаете, одна вещь, которую вы можете сделать, чтобы помочь с этим, подкласс вашей цели рендеринга и включить двойную буферизацию.Для графического блока это будет выглядеть примерно так:

public class DoubleBufferedPictureBox : PictureBox
{
    /// <summary>
    /// Creates an instance of the DoubleBufferedPictureBox.
    /// </summary>
    public DoubleBufferedPictureBox() : base()
    {
        this.SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.DoubleBuffer, true);
    }
}
1 голос
/ 02 сентября 2011

Я немного почистил твой код.Вам, вероятно, не следует использовать для этого коробку с картинками.

Вот форма с панелью:

  public partial class Form1 : Form
  {
    public Bitmap m_bitmap;
    public Point m_lastPoint = Point.Empty;

    public Form1()
    {
      InitializeComponent();   
      m_bitmap = new Bitmap(panel1.ClientSize.Width, panel1.ClientSize.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
      using (Graphics g = Graphics.FromImage(m_bitmap))
        g.Clear(SystemColors.Window);
    }

    private void panel1_Paint(object sender, PaintEventArgs e)
    {
      e.Graphics.DrawImage(m_bitmap, new Point(0, 0));
    }

    private void panel1_MouseDown(object sender, MouseEventArgs e)
    {
      m_lastPoint = e.Location;
    }

    private void panel1_MouseMove(object sender, MouseEventArgs e)
    {
      if (e.Button == MouseButtons.Left)
      {
        using (Graphics g = Graphics.FromImage(m_bitmap))
          g.DrawLine(Pens.Black, m_lastPoint, e.Location);

        m_lastPoint = e.Location;    
        panel1.Invalidate();
      }
    }  
  }
...