如標題,因為SetPixel太慢,因此我在論壇上找到了利用LockBit的方法想要增加速度他是讀出來直接輸出圖片但是我希望他能夠儲存再一個事先宣告好的二維陣列以便將來做處理,最後再經由這個二維陣列用同樣的LockBit方法輸出我將論壇找到的程式碼改了一下但是卻發現,我輸入到二維陣列,出了那個副程式 值就不見了,想請各位大大幫我看看問題出在哪裡,謝謝!
下面看到,我先把data這個二維陣列宣告為全域變數,所以我不懂後面為什麼會不見變成nullpublic partial class Form1 : Form
{
String filename;
public int height, width;
public int[,] data;
Bitmap input; private void 開啟ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
filename = openFileDialog1.FileName;
pictureBox1.Image = Image.FromFile(filename); input = new Bitmap(filename);
height = input.Height;
width = input.Width; int[,] data = new int[height,width]; /*利用記憶體Lock方式讀取圖片(比 GetPixel 快許多)*/
Bitmap bmpOut = new Bitmap(width, height, PixelFormat.Format24bppRgb); BitmapData dataIn = input.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
BitmapData dataOut = bmpOut.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
//在C#下,用指摽必須先宣告一段unsafe,在此範圍內才可用指標。
unsafe
{
byte* pIn = (byte*)(dataIn.Scan0.ToPointer());
byte* pOut = (byte*)(dataOut.Scan0.ToPointer()); for (int y = 0; y < dataIn.Height; y++)
{
for (int x = 0; x < dataIn.Width; x++)
{
data[x, y] = pIn[0];
data[x, y] = pIn[0];
data[x, y] = pIn[0]; pOut[0] = (byte)data[x, y];
pOut[1] = (byte)data[x, y];
pOut[2] = (byte)data[x, y]; pIn += 3;
pOut += 3;
} pIn += dataIn.Stride - dataIn.Width * 3;
pOut += dataOut.Stride - dataOut.Width * 3;
}
} bmpOut.UnlockBits(dataOut);
input.UnlockBits(dataIn);
pictureBox1.Image = bmpOut;
}
}
下面看到,我先把data這個二維陣列宣告為全域變數,所以我不懂後面為什麼會不見變成nullpublic partial class Form1 : Form
{
String filename;
public int height, width;
public int[,] data;
Bitmap input; private void 開啟ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
filename = openFileDialog1.FileName;
pictureBox1.Image = Image.FromFile(filename); input = new Bitmap(filename);
height = input.Height;
width = input.Width; int[,] data = new int[height,width]; /*利用記憶體Lock方式讀取圖片(比 GetPixel 快許多)*/
Bitmap bmpOut = new Bitmap(width, height, PixelFormat.Format24bppRgb); BitmapData dataIn = input.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
BitmapData dataOut = bmpOut.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
//在C#下,用指摽必須先宣告一段unsafe,在此範圍內才可用指標。
unsafe
{
byte* pIn = (byte*)(dataIn.Scan0.ToPointer());
byte* pOut = (byte*)(dataOut.Scan0.ToPointer()); for (int y = 0; y < dataIn.Height; y++)
{
for (int x = 0; x < dataIn.Width; x++)
{
data[x, y] = pIn[0];
data[x, y] = pIn[0];
data[x, y] = pIn[0]; pOut[0] = (byte)data[x, y];
pOut[1] = (byte)data[x, y];
pOut[2] = (byte)data[x, y]; pIn += 3;
pOut += 3;
} pIn += dataIn.Stride - dataIn.Width * 3;
pOut += dataOut.Stride - dataOut.Width * 3;
}
} bmpOut.UnlockBits(dataOut);
input.UnlockBits(dataIn);
pictureBox1.Image = bmpOut;
}
}
解决方案 »
- WinForm和WebBrowser交互操作,input如何去掉disabled
- 求用1个datagridview同时显示多条结果。
- 数据库操作异常:操作无效,连接已关闭
- 三层结构目前是否有科学的定义?
- The type initializer for 'SocketTest.Program' threw an exception.
- 关于静态变量(static)的问题 急
- 请教各位大哥,怎么做一个ip地址输入框控件,但是没有成功。请教各位高招!
- 修改webbrowser显示的内容
- 最近学习c#
- DATAGRID FOR WINDOW 应用程序的问题
- string.Format动态
- 工厂模式中反射出问题了
{
for (int x = 0; x < dataIn.Height; x++)
{
这里你用得是局部变量,和全局变量的名字一样是不行的.这像全局变量就不会起作用的
改成
data = new int[width,height];
這裡你用得是局部變量,和全局變量的名字一樣是不行的.這像全局變量就不會起作用的
改成
data = new int[width,height];//--------------------------感謝xingyuebuyu的回答原來我連最基本的都疏忽了!感嗯!