setpixel太慢,用LockBit讀圖後純入二維陣列

garybo14 2010-05-03 12:04:37
如標題,因為SetPixel太慢,因此我在論壇上找到了利用LockBit的方法想要增加速度

他是讀出來直接輸出圖片

但是我希望他能夠儲存再一個事先宣告好的二維陣列

以便將來做處理,最後再經由這個二維陣列用同樣的LockBit方法輸出

我將論壇找到的程式碼改了一下

但是卻發現,我輸入到二維陣列,出了那個副程式 值就不見了,想請各位大大幫我看看問題出在哪裡,謝謝!


下面看到,我先把data這個二維陣列宣告為全域變數,所以我不懂後面為什麼會不見變成null

public 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;

}

}


...全文
273 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzx509 2010-05-03
  • 打赏
  • 举报
回复
[Quote=引用楼主 garybo14 的回复:]
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];
...
[/Quote]
这个循环改成就可以了

for (int y = 0; y < dataIn.Width; y++)
{
for (int x = 0; x < dataIn.Height; x++)
{
garybo14 2010-05-03
  • 打赏
  • 举报
回复
int[,] data = new int[height,width];
這裡你用得是局部變量,和全局變量的名字一樣是不行的.這像全局變量就不會起作用的
改成
data = new int[width,height];

//--------------------------

感謝xingyuebuyu的回答

原來我連最基本的都疏忽了!

感嗯!
xingyuebuyu 2010-05-03
  • 打赏
  • 举报
回复
int[,] data = new int[height,width];
这里你用得是局部变量,和全局变量的名字一样是不行的.这像全局变量就不会起作用的
改成
data = new int[width,height];

110,572

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧