C# BMP图象处理问题

程序2个图片框:2个按钮,picbox1显示处理前的图片box2显示处理后的图片.程序实现的功能是黑白处理,直接载入一张1024*768的图片代码如下:usingSyst... 程序2个图片框:2个按钮,picbox1显示处理前的图片box2显示处理后的图片.程序实现的功能是黑白处理,直接载入一张1024*768的图片
代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace lvse
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog lvse = new OpenFileDialog();
lvse.Title = "选择图片";
lvse.InitialDirectory = "";
lvse.Filter = "*.bmp|*.bmp";
lvse.FilterIndex = 1;
if (lvse.ShowDialog() == DialogResult.OK)
{
pictureBox1.Image = Image.FromFile(lvse.FileName);
pictureBox2.Image = Image.FromFile(lvse.FileName);//问题1
}
}

private void button2_Click(object sender, EventArgs e)
{
int i,j;
Color c= new Color();
Bitmap b = new Bitmap(pictureBox1.Image);
Bitmap b1 = new Bitmap(pictureBox2.Image);//错误1
Graphics g1 = pictureBox1.CreateGraphics();
for (i = 0; i < 1024; i++)//错误2
{
for (j = 0; j < 768; j++)//错误2
{
c = b.GetPixel(i, j);//错误3
Color c1 = Color.FromArgb(c.B, c.B, c.B);
b1.SetPixel(i, j, c1);
}
pictureBox2.Refresh();
pictureBox2.Image = b1;
}
}
}
}

1.如果将//问题1的那行代码去掉 在//错误1处 提示"未处理NullReferenceException-----未将对象引用设置到对象的实例"
2.问题1的代码保留,错误3处提示"未处理ArgumentOutOfRangeException---参数必须为正且小于高度。
参数名: y"
3.问题1的代码保留,将//错误2处的1024 768分别改为:picturebox1.width和picturebox2.heith可以运行 但是图象处理不完全 仅处理大概1/8的图象

求高人解惑 急
展开
 我来答
百度网友94f02eb
2009-03-19 · TA获得超过8613个赞
知道大有可为答主
回答量:7955
采纳率:74%
帮助的人:4522万
展开全部
private void button1_Click(object sender, EventArgs e)
{
using (OpenFileDialog lvse = new OpenFileDialog())
{
lvse.Title = "选择图片";
lvse.InitialDirectory = "";
lvse.Filter = "*.bmp|*.bmp";
lvse.FilterIndex = 1;

if (lvse.ShowDialog() == DialogResult.OK)
{
pictureBox1.Image = Image.FromFile(lvse.FileName);

pictureBox2.Image = pictureBox1.Image.Clone() as Image;
}
}
}

private void button2_Click(object sender, EventArgs e)
{
int imageWidth = pictureBox1.Image.Width;
int imageHeight = pictureBox1.Image.Height;

Bitmap bmp = new Bitmap(pictureBox2.Image);
for (int x = 0; x < imageWidth; x++)
{
for (int y = 0; y < imageHeight; y++)
{
Color pixelColor = bmp.GetPixel(x, y);
bmp.SetPixel(x, y, Color.FromArgb(pixelColor.B, pixelColor.B, pixelColor.B));
}
}

pictureBox2.Image = null;
pictureBox2.Image = bmp;
pictureBox2.Refresh();
}
百度网友6809e30a0
2009-03-19 · TA获得超过5285个赞
知道大有可为答主
回答量:3765
采纳率:0%
帮助的人:2833万
展开全部
1、你没有在问题1那里加载图片,就去错误1那里进行处理,当然会空指针异常

2、如果你在问题1里面加载的图片尺寸小于1024*768,那么getpixel就会超出范围,自然就出现那个错误了,建议用图片的实际大小来代替那1024和768

3、麻烦你用picturebox1.height代替picturebox2.heith再试

PS:你要复制图片有必要这么麻烦不?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
掌碧奇以
2019-09-08 · TA获得超过3762个赞
知道大有可为答主
回答量:3160
采纳率:32%
帮助的人:195万
展开全部
呵呵。你这个程序还没弄完啊?
你还有多少种变换方法啊?
这个问题和你第一个把分辨率降低一半那个问题一样啊。
for
(int
i
=
0;
i
<
box1.Width
-
1;
i
+=
3)
for
(int
j
=
0;
j
<
box1.Height
-
1;
j
+=
3)
box1.Width
-
1
应该改成
box1.Width-3
box1.Height
-
1
应该改成
box1.Height-3
box1.SetPixel(i
+
k1,
j
+
k2,
c1);
这句外边加上判断
if
(i
+
k1
<
box1.Width
&&
j
+
k2
<
boxe.Height)
{
box1.SetPixel(i
+
k1,
j
+
k2,
c1);
}
-----------
前边两段,这样看不出问题。
你得把代码补全才行啊
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式