这是楼主在开发C#上位机的时候遇到的另一个问题,怎么把RGB565转为BITMAP,在CSDN上搜索,要么是安卓平台的,要么是2011年的古早代码(还没排版),还是靠自己和DEEPSEEK的智慧解决了(●’◡’●) 当然,凭良心说话,楼主主要负责DEBUG和调试。为了让大家少走弯路,所以也就贴出啦。
上位机也在锐意开发中啊!实现的功能是ESP和PC使用WLAN图传。有这方面需求的小伙伴可以关注一下我的项目
这是GITCODE项目地址
这个项目我这个寒假会一直做下去丰富更多的功能,包括WLAN 收发什么的
GITHUB?仓库建好了,但是不知道为啥传不上去(;′⌒`)
如果这对你有帮助,还请点点STAR,点点赞,点点关注,这对我真的很重要,谢谢ヾ(•ω•`)o
public static Bitmap ConvertRgb565ToBitmap(byte[] imageData, int width, int height)
{
// 创建一个新的Bitmap对象
Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format32bppArgb);
// 锁定Bitmap的像素数据
BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
// 获取指向Bitmap像素数据的指针
IntPtr ptr = bitmapData.Scan0;
// 分配内存来存储转换后的像素数据
int bytes = Math.Abs(bitmapData.Stride) * height;
byte[] rgbValues = new byte[bytes];
// 遍历每个像素并转换RGB565到RGB888
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
int index = (y * width + x) * 2;
ushort rgb565 = BitConverter.ToUInt16(imageData, index);
// 提取RGB565的红色、绿色和蓝色分量
byte red = (byte)((rgb565 >> 11) & 0x1F);
byte green = (byte)((rgb565 >> 5) & 0x3F);
byte blue = (byte)(rgb565 & 0x1F);
// 将5位和6位分量扩展为8位
red = (byte)((red * 255) / 31);
green = (byte)((green * 255) / 63);
blue = (byte)((blue * 255) / 31);
// 计算ARGB值
int argb = 255 << 24 | red << 16 | green << 8 | blue;
// 计算在rgbValues中的索引
int pos = (y * bitmapData.Stride) + (x * 4);
rgbValues[pos] = (byte)blue;
rgbValues[pos + 1] = (byte)green;
rgbValues[pos + 2] = (byte)red;
rgbValues[pos + 3] = 255; // Alpha通道
}
}
// 将转换后的像素数据复制回Bitmap
Marshal.Copy(rgbValues, 0, ptr, bytes);
// 解锁Bitmap的像素数据
bitmap.UnlockBits(bitmapData);
return bitmap;
}
最后贴一张楼主的开发进度