求一个C#读取BMP图片像素的完整代码,或者可以下载到的网址也可以

 我来答
百度网友5722492f7
2013-03-12 · TA获得超过725个赞
知道小有建树答主
回答量:594
采纳率:0%
帮助的人:469万
展开全部
using System.Runtime.InteropServices;
[DllImport("gdi32.dll")]
public static extern IntPtr ExtCreateRegion(IntPtr lpXform, uint nCount,
ref byte lpRgnData);

public static int RGN_AND = 1;
public static int RGN_OR = 2;
public static int RGN_XOR = 3;
public static int RGN_DIFF = 4;
public static int RGN_COPY = 5;
public static int RGN_MIN = RGN_AND;
public static int RGN_MAX = RGN_COPY;

[DllImport("gdi32.dll")]
public static extern int CombineRgn(IntPtr hrgnDest, IntPtr hrgnSrc1, IntPtr hrgnSrc2,
int fnCombineMode);

[DllImport("gdi32.dll")]public static extern bool DeleteObject(IntPtr hObject);
public Region ImageToRegion(Image AImage, Color ATransparent)
{
//转贴请注明出处ZswangY37(wjhu111#21cn.com) 时间2007-05-25
if (AImage == null) return null;
Bitmap vBitmap = new Bitmap(AImage);
BitmapData vBitmapData = vBitmap.LockBits(
new Rectangle(0, 0, vBitmap.Width, vBitmap.Height),
ImageLockMode.ReadOnly, PixelFormat.Format32bppRgb);
int vAddress = (int)vBitmapData.Scan0;
int vOffset = vBitmapData.Stride - vBitmap.Width * 4; // 每行多出的字节数
int h = vBitmap.Height, w = vBitmap.Width;
int vTransparent = ColorTranslator.ToWin32(ATransparent); // 透明色
int vAllocRect = (0x1000 - sizeof(uint) * 8) / sizeof(int); // 预分配的矩形数
if (h * w < vAllocRect) vAllocRect = h * w;
Byte[] vBuffer = new byte[sizeof(uint) * 8 + sizeof(int) * 4 * vAllocRect];
//头信息dwSize\iType\nCount\nRegSize
uint vCount = 0;
vBuffer[0] = sizeof(uint) * 8; //dwSize//头信息大小
vBuffer[4] = 1; //iType//int RDH_RECTANGLES = 1;//数据类型
IntPtr vResult = IntPtr.Zero;

uint vPointer = sizeof(uint) * 8;
bool vWriteRect = false; bool vWriteAlways = false;
for (int y = 0; y < h; y++)
{
int vBlockStart = 0;
bool vLastMaskBit = false;

for (int x = 0; x < w; x++)
{
int i = Marshal.ReadInt32((IntPtr)vAddress) & 0x00FFFFFF;
if (vTransparent == i) // 透明色
{
if (vLastMaskBit)
vWriteRect = true;
}
else
{
if (!vLastMaskBit)
{
vBlockStart = x;
vLastMaskBit = true;
}
}
if (x == w - 1)
{
if (y == h - 1)
{
vWriteRect = true;
vWriteAlways = true;
}
else if (vLastMaskBit)
{
vWriteRect = true;
}
x++;
}
if (vWriteRect)
{
if (vLastMaskBit)
{
vCount++;
WriteRect(vBuffer, ref vPointer,
new Rectangle(vBlockStart, y, x - vBlockStart, 1));
}
if (vCount == vAllocRect || vWriteAlways)
{

vBuffer[8] = (byte)vCount;
vBuffer[9] = (byte)(vCount >> 8);
vBuffer[10] = (byte)(vCount >> 16);
vBuffer[11] = (byte)(vCount >> 24);
IntPtr hTemp = ExtCreateRegion(IntPtr.Zero,
sizeof(uint) * 8 + sizeof(int) * 4 * vCount,
ref vBuffer[0]);
if (vResult == IntPtr.Zero)
vResult = hTemp;
else
{
CombineRgn(vResult, vResult, hTemp, RGN_OR);
DeleteObject(hTemp);
}
vCount = 0;
vPointer = sizeof(uint) * 4;
vWriteAlways = false;
}
vWriteRect = false;
vLastMaskBit = false;
}
vAddress += 4;
}
vAddress += vOffset;
}

vBitmap.UnlockBits(vBitmapData);
return Region.FromHrgn(vResult);
}

private void WriteRect(byte[] ARGNData, ref uint ptr, Rectangle r)
{
ARGNData[ptr] = (byte)r.X;
ARGNData[ptr + 1] = (byte)(r.X >> 8);
ARGNData[ptr + 2] = (byte)(r.X >> 16);
ARGNData[ptr + 3] = (byte)(r.X >> 24);
ARGNData[ptr + 4] = (byte)r.Y;
ARGNData[ptr + 5] = (byte)(r.Y >> 8);
ARGNData[ptr + 6] = (byte)(r.Y >> 16);
ARGNData[ptr + 7] = (byte)(r.Y >> 24);
ARGNData[ptr + 8] = (byte)r.Right;
ARGNData[ptr + 9] = (byte)(r.Right >> 8);
ARGNData[ptr + 10] = (byte)(r.Right >> 16);
ARGNData[ptr + 11] = (byte)(r.Right >> 24);
ARGNData[ptr + 12] = (byte)r.Bottom;
ARGNData[ptr + 13] = (byte)(r.Bottom >> 8);
ARGNData[ptr + 14] = (byte)(r.Bottom >> 16);
ARGNData[ptr + 15] = (byte)(r.Bottom >> 24);
ptr += 16;
}

private void button1_Click(object sender, EventArgs e)
{
Region = ImageToRegion(pictureBox1.Image, Color.FromArgb(216, 233, 236));
}

来源:http://bbs.csdn.net/topics/230025357
狮是搞完泪18
2013-03-12 · TA获得超过269个赞
知道小有建树答主
回答量:257
采纳率:0%
帮助的人:255万
展开全部
以下是我的测试代码,希望对你有所帮助
private void ScreenPicture()
{
Bitmap bitMap = new Bitmap("XXXX.bmp");
BitmapData bitMapData = bitMap.LockBits(new Rectangle(0, 0, bitMap.Width, bitMap.Height)
, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); //以24位像素读取
IntPtr nFirstAdress = bitMapData.Scan0;
byte[] bytePicturePixels = new byte[bitMap.Width * bitMap.Height * 3];
Marshal.Copy(nFirstAdress, bytePicturePixels, 0, bitMap.Width * bitMap.Height * 3);
for (int i = 0; i < bytePicturePixels.Length; i += 3)
{
//遍历所有的像素
}
Marshal.Copy(bytePicturePixels, 0, nFirstAdress, bitMap.Width * bitMap.Height * 3);
bitMap.UnlockBits(bitMapData);
}
最后两句是如果有修改的话,重新Copy到BitmapData中,如果是读取的话,可以使用只读的方式取得BitmapData对象
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式