例如:
//把图象变成单色的图
public void singlBmp(Bitmap bit)
{
Color c = new Color();
Color cc = new Color();
int rr, gg, bb;
for (int i = 0; i < bit.Width; i++)
{
for (int j = 0; j <bit.Height; j++)
{
c = bit.GetPixel(i, j);
rr = rrIn[c.R];
cc = Color.FromArgb(rr, rr, rr);
bit.SetPixel(i, j, cc);
}
}
}
//如果放到线程里面会很卡,处理的很慢
7 个解决方案
#1
我所知道的图象处理和识别,很少直接用Bitmap类,或者说很多用自己的数据结构,比如OpenCV用cvImage。
如果要一定要用Bitmap类,可以用Bitmap.LockBits来拿到BitmapData数据后自己处理。
Bitmap.GetPixel是个通用的函数,它的确非常的慢。
如果要一定要用Bitmap类,可以用Bitmap.LockBits来拿到BitmapData数据后自己处理。
Bitmap.GetPixel是个通用的函数,它的确非常的慢。
#2
不了解 顶顶再说
#3
学习帮顶
#4
给你写一个吧。。。。。。
右击解决方案,生成里面,勾选上 允许不安全代码。。。
右击解决方案,生成里面,勾选上 允许不安全代码。。。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Imaging;
namespace neicun
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Bitmap m_Bmp = new Bitmap("d:\\nvhai.bmp");
int h = m_Bmp.Height;
int w = m_Bmp.Width;
Bitmap bmpOut = new Bitmap(w, h, PixelFormat.Format24bppRgb);
BitmapData dataIn = m_Bmp.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
BitmapData dataOut = bmpOut.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
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++)
{
pOut[1] = pOut[0];
pOut[2] = pOut[0];
pIn += 3;
pOut += 3;
}
pIn += dataIn.Stride - dataIn.Width * 3;
pOut += dataOut.Stride - dataOut.Width * 3;
}
}
bmpOut.UnlockBits(dataOut);
m_Bmp.UnlockBits(dataIn);
pictureBox1.Image = bmpOut;
}
}
}
#5
up
#6
有一点你错了:
for (int x = 0; x < dataIn.Width; x++)
{
pOut[0] = pIn[0];
pOut[1] = pIn[0];
pOut[2] = pIn[0];
pIn += 3;
pOut += 3;
}
#7
如果不使用不安全代码
可以使用
然后使用System.Runtime.InteropServices.Marshal.Copy 把数据复制出来
可以使用
然后使用System.Runtime.InteropServices.Marshal.Copy 把数据复制出来
#1
我所知道的图象处理和识别,很少直接用Bitmap类,或者说很多用自己的数据结构,比如OpenCV用cvImage。
如果要一定要用Bitmap类,可以用Bitmap.LockBits来拿到BitmapData数据后自己处理。
Bitmap.GetPixel是个通用的函数,它的确非常的慢。
如果要一定要用Bitmap类,可以用Bitmap.LockBits来拿到BitmapData数据后自己处理。
Bitmap.GetPixel是个通用的函数,它的确非常的慢。
#2
不了解 顶顶再说
#3
学习帮顶
#4
给你写一个吧。。。。。。
右击解决方案,生成里面,勾选上 允许不安全代码。。。
右击解决方案,生成里面,勾选上 允许不安全代码。。。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Imaging;
namespace neicun
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Bitmap m_Bmp = new Bitmap("d:\\nvhai.bmp");
int h = m_Bmp.Height;
int w = m_Bmp.Width;
Bitmap bmpOut = new Bitmap(w, h, PixelFormat.Format24bppRgb);
BitmapData dataIn = m_Bmp.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
BitmapData dataOut = bmpOut.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
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++)
{
pOut[1] = pOut[0];
pOut[2] = pOut[0];
pIn += 3;
pOut += 3;
}
pIn += dataIn.Stride - dataIn.Width * 3;
pOut += dataOut.Stride - dataOut.Width * 3;
}
}
bmpOut.UnlockBits(dataOut);
m_Bmp.UnlockBits(dataIn);
pictureBox1.Image = bmpOut;
}
}
}
#5
up
#6
有一点你错了:
for (int x = 0; x < dataIn.Width; x++)
{
pOut[0] = pIn[0];
pOut[1] = pIn[0];
pOut[2] = pIn[0];
pIn += 3;
pOut += 3;
}
#7
如果不使用不安全代码
可以使用
然后使用System.Runtime.InteropServices.Marshal.Copy 把数据复制出来
可以使用
然后使用System.Runtime.InteropServices.Marshal.Copy 把数据复制出来