摄像头 保存bmp图片, 从而引出的bmp格式的问题!

mnxm 2013-10-09 08:18:45
打开摄像头 保存bmp代码如下(如果觉得头疼可先看看我的后面的文字说明,然后再看代码)

[DllImport("avicap32.dll", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern int capCreateCaptureWindowA([MarshalAs(UnmanagedType.VBByRefStr)] ref string lpszWindowName, int dwStyle, int x, int y, int nWidth, short nHeight, int hWndParent, int nID);
[DllImport("user32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern bool DestroyWindow(int hndw);
[DllImport("user32", EntryPoint = "SendMessageA", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern int SendMessage(int hwnd, int wMsg, int wParam, [MarshalAs(UnmanagedType.AsAny)] object lParam);
[DllImport("user32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern int SetWindowPos(int hwnd, int hWndInsertAfter, int x, int y, int cx, int cy, int wFlags);

//open method
hHwnd = ControlCamera.capCreateCaptureWindowA(ref refDevice, 1342177280, 0, 0, 640, 360, this.videoWindow.Handle.ToInt32(), 0);

if (ControlCamera.SendMessage(hHwnd, 0x40a, intDevice, 0) > 0)
{
ControlCamera.SendMessage(this.hHwnd, 0x435, -1, 0);
ControlCamera.SendMessage(this.hHwnd, 0x434, 0x42, 0);
ControlCamera.SendMessage(this.hHwnd, 0x432, -1, 0);
ControlCamera.SetWindowPos(this.hHwnd, 1, 0, 0, intWidth, intHeight, 6);
isOpen = true;
}
else
{
ControlCamera.DestroyWindow(this.hHwnd);
}

//another method
IDataObject obj_camera = Clipboard.GetDataObject();

Image image_camera = (Image)obj_camera.GetData(typeof(Bitmap));

image_camera.Save(str, ImageFormat.Bmp);


1.通过上面的代码保存出来的bmp是 3M多大

2.把这个bmp通过画图进行稍微的编辑(实际仅仅使用画笔点了个点,图片尺寸格式均未改变) 保存 2M多大
再对这个2M 大的图片进行画图编辑 保存 大小几乎不变了
相信第二步保存bmp肯定丢弃了bmp中的一些信息

问题:我的代码如何修改才能保存出步骤2中的 2M 多大的bmp图片?

我想直接保存这个2M大图片的原因:我想对某两个图片进行像素的比较(此部分工作通过C++做的,封装dll,并由C#调用),但是使用步骤1那个3M的图片解析的有问题,但使用步骤2保存的图片没问题。

如果您知道可能的原因,请不吝赐教,在此先拜谢。悬赏分会酌情增加。
...全文
258 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
mnxm 2013-10-10
  • 打赏
  • 举报
回复
引用 1 楼 barbara2008 的回复:
估计3M多的那个是带alpha通道的32位位图,2M的是24位的,你把channel读出来看看
阁下说的正是我遇到的问题,现问题已解决 解决办法参考:http://bbs.csdn.net/topics/70119231 十分感谢
barbara2008 2013-10-09
  • 打赏
  • 举报
回复
估计3M多的那个是带alpha通道的32位位图,2M的是24位的,你把channel读出来看看
本设计是以STM32VET6作为主控制器,外围辅以3.5寸TFT液晶、SD卡、VS1003(VS1003数据手册)音频解码器、spi flash、AL422(AL422数据手册)FIFO Memory、XPT2046(XPT2046数据手册)触摸IC、pl2303(pl2303数据手册)USB转串口IC等,实现了一个功能丰富的小设备。本设计中使用的TFT作为显示单元,屏是3.5寸的分辨率320*480,控制IC为ILI9481,通过STM32的FSMC总线与系统相连,写屏速度还是挺快的,如果有片大RAM做显存,通过DMA总线操作的话就更快了,不过之前没考虑到啊!使用SD卡作为数据存储,这里充分利用片子的优势,用得是SDIO接口,比SPI快多了,能够支持FAT16/32文件系统。 本设计实现的主要功能描述: 1.音乐播放,使用vs1003音频解码芯片,能支持大部分主流的音频格式,可以上一曲、下一曲,可以快退快进,播放界面是模仿了千千静听中的“炫紫神话”皮肤,界面的实现完全是通过软件绘制的方式,没有贴任何图片,为了实现那些层次阴影的效果,综合运用了颜色渐变,颜色叠加的方法,特别是那个圆形按钮花了不少时间,大家看看是不是还有点立体感呢,在界面中也显示了频谱,不过频谱数据是从vs1003中读取的,好像不怎么准确的,不过也将就了。(注:EQ、LRC功能没实现,所以那两个按钮也是无用的) 2.图片播放部分主要是一直正点原子的代码,能支持BMP、JPEG图片的显示。在选中播放功能后显示进入文件浏览界面,界面中只会显示需要播放的文件格式与文件夹,比如进入图片播放的文件浏览界面中,就只会显示可以打开的图片与文件夹,其他功能也是一样。另外在文件浏览中,可以通过上下左右滑动触摸来翻页的。 3.电子书阅读功能,可以打开常见的文本文件,如.txt、.lrc、.c、.h,系统中集成了GB2312字库,有12*12、16*16、24*24三种大小,它们被存储在一片SPI FLASH中,型号是EN25F16。 4.照相机功能,这个没有实现完成,可以将摄像头的数据取来并实时显示在TFT屏上,但不能保存照片,可以支持ov7670和ov7725两种摄像头摄像头是通过AL422 FIFO与MCU接口的,图像数据先进FIFO中,然后MCU根据场中断开始提取数据,可以刷个4~5帧吧,具体没测,由于现在手头上没摄像头了,没有上这部份功能的图,但程序中是有这部份功能的。 5.拼图游戏这部份是移植的网络中的代码,不过实现起来也不难,比较容易理解,游戏分3个难度等级,3*3、4*4、5*5,也没太多可说的,看图吧。 6.时间显示部分实现了一个指针式的时钟,这里的表盘是图片了,因为软件画的话比较麻烦,指针的绘制参考了ucgui中画多边形的代码,并且使用了透明效果,指针遮挡部位下面的文字图案依然能看到的。温度采集用得是片内的线性温度传感器,温度偏高了,不过硬件上预留了DS18B20的位置,暂未使用。 7.触摸画板功能可以实时显示在触屏上画下的线条,这个功能比较简单了,不过也有待完善。 8.文件浏览跟前面提到的进入播放功能后打开的浏览界面是一样的,只是这里不分文件格式了,任何格式的文件都会显示,方便查看。 9.系统设定部分提供了一些设置系统参数的接口,如日期时间设定、触摸校正,还有一些设置没完成。 10.USB设备功能,STM32自带了一个USB2.0设备接口,可方便的实现一些USB传输功能,本系统通过USB与计算机连接,可以枚举成USB mass storage和HID Mouse两种设备,mass storage功能实际就是将系统枚举为一个U盘了,可以方便通过计算机管理系统SD卡中的文件,速度不很快,200~300KB左右,板子背部有个LED可表示USB的读写状态,HID Mouse就是将系统枚举为一个鼠标了,通过在触屏上滑动,点击控制计算机上鼠标指针的行为,不过由于电阻屏的特点,我也没仔细写代码,使用效果不好,不过USB通信这块是完善的,另外本设计中还加入了一片pl2303 USB转口芯片,该芯片传出串口与STM32的UART1相连,可方便的通过串口下载程序,或打印log调试信息等。 在做这个毕业设计中,硬件的设计当时考虑了很多,其实还预留了一些功能,比如MIC、IR,不过暂时未使用,电源部分,将TFT供电与其他部分的供电隔开了,是各自单独用了一片稳压IC的,而且各部分的供电是可以通过左侧边的几个排阵控制的,这里还引出几个未用的引脚供试验用,另外为了充分利用这块板,TFT所有的引脚通过左上边的一个座子引出了,可以单独去使用这个TFT,由于供电是隔开的,所以不必担心其他部分的干扰,也不会给板上的STM32供电。

4,447

社区成员

发帖
与我相关
我的任务
社区描述
图形图像/机器视觉
社区管理员
  • 机器视觉
  • 迪菲赫尔曼
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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