rgb32 byte[] to bitmap(100分 请帮忙)

guestb 2009-04-07 03:25:38
我需要把rgb32 的 byte[]数组 转换到 bitmap 对象中

写了下面函数,但是发现转换回来的图像是灰色的,图像里面的文字能看出来。

估计是颜色方面出了问题。但是看不出错误来。

麻烦大家帮忙看看。

非常感谢。

// Create RGB32 bitmap from Byte array
Bitmap BitsToBitmapRGB32(Byte[] bytes, int width, int height)
{
//swap ARGB to BGRA

Byte tmp;
for (int x = 4; x < bytes.GetLength(0); x += 4)
{
//swap A B
tmp = bytes[(x + 3)];
bytes[x + 3] = bytes[x];
bytes[x] = tmp;

//swap R G
tmp = bytes[(x + 2)];
bytes[x + 2] = bytes[x+1];
bytes[x+1] = tmp;

}

if (bytes.GetLength(0) < width * height * 4)
{
return null;
}

Bitmap bmp = new Bitmap(width, height, PixelFormat.Format32bppArgb);
int i;

BitmapData data = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height),
ImageLockMode.WriteOnly, bmp.PixelFormat);


if (data.Stride == width * 4)
{
Marshal.Copy(bytes, 0, data.Scan0, width * height * 4);
}
else
{
for (i = 0; i < bmp.Height; i++)
{
IntPtr p = new IntPtr(data.Scan0.ToInt32() + data.Stride * i);
Marshal.Copy(bytes, i * bmp.Width * 4, p, bmp.Width * 4);
}
}

bmp.UnlockBits(data);

return bmp;
}
...全文
477 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
SJSSJS 2012-08-30
  • 打赏
  • 举报
回复
很想看看怎么改的。
zhaoyaxu2010 2010-07-07
  • 打赏
  • 举报
回复
asdasdasd
himoggy 2009-04-09
  • 打赏
  • 举报
回复
或者参考
http://zhidao.baidu.com/question/66246018.html?si=2
^^
himoggy 2009-04-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 guestb 的回复:]
Byte[] bytes;//图象数据
MemoryStream stream=new MemoryStream(bytes);
Bitmap bitmap = new Bitmap(width,height);
bitmap.FromStream(stream);


运行报错。


用我这个函数,我先把rgb32转换成rgb24,bytes[]按照rgb付给bitmap, 结果背景是红色,如果把bytes改成bgr排列,结果背景是蓝色。
图片中的白色文字显示正常。

请问是什么原因呢??

怎么解决??
[/Quote]



汗 可能笔误?
直接这样呢?
 Byte[] bytes;
MemoryStream stream = new MemoryStream(bytes);
Bitmap bitmap = new Bitmap(stream);
lybelmont 2009-04-08
  • 打赏
  • 举报
回复
貌似曾经看过一些这方面的帖子

好像在读或者写的时候 有的RGB 并不是按照 R G B色点的顺序,有可能是B G R, 但具体是什么情况出现这种 忘记了。。。。。

另外 以前在C下BMP格式的时候,写BMP需要一个翻转
guestb 2009-04-08
  • 打赏
  • 举报
回复
Byte[] bytes;//图象数据
MemoryStream stream=new MemoryStream(bytes);
Bitmap bitmap = new Bitmap(width,height);
bitmap.FromStream(stream);


运行报错。


用我这个函数,我先把rgb32转换成rgb24,bytes[]按照rgb付给bitmap, 结果背景是红色,如果把bytes改成bgr排列,结果背景是蓝色。
图片中的白色文字显示正常。

请问是什么原因呢??

怎么解决??
zgke 2009-04-07
  • 打赏
  • 举报
回复
for (int x = 0; x < bytes.GetLength(0); x += 4)

0开始看看.


另外

Bitmap bmp = new Bitmap(width, height, PixelFormat.Format32bppArgb);
int i;

BitmapData data = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height),
ImageLockMode.WriteOnly, bmp.PixelFormat);

你都定义好了是32位..
下面的
for (i = 0; i < bmp.Height; i++)
{
IntPtr p = new IntPtr(data.Scan0.ToInt32() + data.Stride * i);
Marshal.Copy(bytes, i * bmp.Width * 4, p, bmp.Width * 4);
}
不会执行.,,
sxmonsy 2009-04-07
  • 打赏
  • 举报
回复
不太明白,帮顶
yulien 2009-04-07
  • 打赏
  • 举报
回复
EveryCase 2009-04-07
  • 打赏
  • 举报
回复
顶~~~~~~~~~~~~~
himoggy 2009-04-07
  • 打赏
  • 举报
回复
内存中是BGRA的吧,那就要先确定你的byte[]是什么结构的了吧,8位表示1个分量,Alpha可以不用的
那么还是用流好了
试试周公的:P
周公 2009-04-07
  • 打赏
  • 举报
回复
Byte[] bytes;//图象数据
MemoryStream stream=new MemoryStream(bytes);
Bitmap bitmap = new Bitmap(width,height);
bitmap.FromStream(stream);
周公 2009-04-07
  • 打赏
  • 举报
回复
没有必要这么麻烦吧。用byte[]构造一个MomeryStream,然后调用Bitmap.FromStream(Stream stream)就行了。

111,126

社区成员

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

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

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