wawazhang 发表于 2009-3-23 11:56:24

原创 vc+led显示屏+flash取图转bmp转bin

两年没动vc了,为了找个工作又给捡起来了,程序目的是为了写一个把flash转换成bin或dat格式的数据流文件 放入sd卡中。再用单片机取出放入sram中供cpld取出发送到显示屏中。程序没有写完,这只是抓取一张图片的流程,其他的是相同。只是要多加一个定时器,按照规定的时间按取图数据写入到bin文件或dat文件里。
工程文件:
????ourdev_427326.rar(文件大小:43K) (原文件名:flvtobin.rar)

UpdateData(TRUE);//把窗口值传递到 m_X,m_y里
if((m_x<=512)&&(0<m_x)&&(0<m_y)&&(m_y<=256))
        {
          
        m_flash.SetWindowPos(this,0,0,m_x,m_y,0);//设置flash的位置以及尺寸
          




//1.屏幕截图可以通过BitBlt来实现。用以下方法创建一个指向整个屏幕的DC:
/*
CDC *pScreenDC = new CDC();
HDC hScreenDC = CreateDC("DISPLAY", NULL, NULL, NULL);
pScreenDC->Attach(hScreenDC);*///创建屏幕dc 抓屏幕的话可以使用此段
CClientDC dc(this);


//2.要使用BitBlt,memDC是不可少的,因此要创建memDC:
CDC *pmemDC= new CDC;
pmemDC->CreateCompatibleDC(&dc);

//3.然后创建兼容位图:
CBitmap *pBitmap = new CBitmap();
CBitmap*oldmemBitmap;//建立和屏幕兼容的bitmap
pBitmap->CreateCompatibleBitmap(&dc, m_x,m_y);
oldmemBitmap=pmemDC->SelectObject (pBitmap);//关联内存dc和兼容图片//Selects an object into the device context.

//4.把窗口的dc内容拷贝到内存兼容dc当中
pmemDC->BitBlt( 0, 0, m_x,m_y, &dc, 0, 0, SRCCOPY );
///////////////////////////////////////////////////

/*
5.然后做些收尾工作,将位图对象返回即可:

pBitmap = pMemDC->SelectObject(pOldBitmap);
pMemDC->DeleteDC();
delete pMemDC;
return pBitmap;
*/



////////////////////////////////////////////////////
//6. 获取位图信息 此程序没有用到 在7.中我直接填写了位图的参数
BITMAP bitmap;//
pBitmap->GetBitmap(&bitmap);// CBitmap * pBitmap;

////////////////////////////////////////////////////////////
// 一个图片包括如下结构 此程序是32位代表一个像素点,所以无彩色表
// 位图文件头(bitmap-file header) BITMAPFILEHEADER bmfh
// 位图信息头(bitmap-information header) BITMAPINFOHEADER bmih
// 彩色表(color table) RGBQUAD aColors[]
//  图象数据阵列字节 BYTE aBitmapBits[]

/////////////////////////////////////////////////////////////////
//7.创建位图信息头
LPBITMAPINFO lpbmih = new BITMAPINFO;
lpbmih->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
lpbmih->bmiHeader.biWidth = m_x;
lpbmih->bmiHeader.biHeight =-m_y;//要注意填写负数.不然图像是一个反的图像
lpbmih->bmiHeader.biPlanes = 1;
lpbmih->bmiHeader.biBitCount = 32;
lpbmih->bmiHeader.biCompression = BI_RGB;
lpbmih->bmiHeader.biSizeImage = 0;
lpbmih->bmiHeader.biXPelsPerMeter = 0;
lpbmih->bmiHeader.biYPelsPerMeter = 0;
lpbmih->bmiHeader.biClrUsed = 0;
lpbmih->bmiHeader.biClrImportant = 0;
///////////////////////////////////////////////////////////




//8. 为位图数据分配内存
DWORD count = m_y *m_y *32/ 8;
BYTE * pData = (BYTE*)malloc(sizeof(BYTE) * count);

//9. 获取位图数据
pBitmap->GetBitmapBits(count, pData);

//CreateDIBSection(*pmemDC,lpbmih,DIB_PAL_COLORS,(void **)&pBits,NULL,0);//开始使用CreateDIBSection来获得数据没有得到想要的数据,大家可以尝试一下。
                                                                        //直接从兼容内存dc ,pmendc中取得数据 此函数速度也比较快
//10.位图文件头0x4D42代表了BM 表示图片为位图
BITMAPFILEHEADER bmfh;
ZeroMemory(&bmfh,sizeof(BITMAPFILEHEADER));
bmfh.bfType =0x4D42;
bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
bmfh.bfSize = bmfh.bfOffBits + (m_y * m_y) *32/ 8;


//11.创建位图把相关信息和图像数据写入   
//如果是做led显示屏系统可以 最后在调用file.close() 。图片的bmfh文件头和lpbmih信息头都不用写入
//按照自的格式来写,例如写入图片的尺寸 后面紧跟就是n张图片的数据,(生成的文件放入sd卡)
//这样单片机读出尺寸后计算出每次读多少字节。发送给到sram中,然后cpld从sram中读数据按照一定的规则发给显示屏
//文件名称的后缀名可以任意为bin或dat。
TCHAR szBMPFileName;
strcpy(szBMPFileName,"1.bmp");
CFile file;
if(file.Open(szBMPFileName,CFile::modeWrite | CFile::modeCreate))
{

        file.Write(&bmfh,sizeof(BITMAPFILEHEADER));
        file.Write(&(lpbmih->bmiHeader),sizeof(BITMAPINFOHEADER));
        file.Write(pData,count);
        file.Close();
}

durgy 发表于 2009-3-23 12:13:51

不错,要点都有写出来

xiaozhiyong 发表于 2009-3-23 12:14:17

mark.................

zcllom 发表于 2009-3-23 15:39:09

主要是三步:屏幕截图—>转换格式—>写成文件。

wawazhang 发表于 2009-3-23 17:31:59

楼上说的对一共三步,但是从兼容dc中,我没有取出图片来,而是把图片从兼容dc传入兼容位图 ,从兼容位图中找到的位图 。应该使用CreateDIBSection这个函数就比较省事了。让初学者更好理解。

zcllom 发表于 2009-3-23 18:22:13

Cshockwaveflash这个类从哪找到的?

wawazhang 发表于 2009-3-24 14:33:20

就是哪个控件 只要你的电脑能看flash动画 就有这个控件。这个控件的类就是Cshockwaveflash

wawazhang 发表于 2009-4-10 15:21:37

此程序缺点: 取出一个点的数据 是 FF FF FF FF 的格式 现在我在改版 不使用保存图片方式 直接使用CDC::GetPixel
COLORREF GetPixel( int x, int y ) const;这个函数 然后处理返回的数据直接放入文件中 。速度是慢了很多 不过可以直接从内存DC中取出所要的数据 不需要下面繁琐的步骤了 使用BitBlt速度快,但后面还是要一个一个的数据处理 。要自己写一个数据结构。简单的事情搞复杂

hiux 发表于 2009-4-10 18:44:13

支持一下

antonine 发表于 2009-4-22 18:02:53

支持一下

hyz_avr 发表于 2009-4-22 18:40:20

我也该支持一下啊..

r051463438 发表于 2009-6-11 20:43:27

讲得好高深,现在的水平还看不懂,先记个号,以后再看.

lichangan 发表于 2009-6-12 13:28:01

等待楼主的佳作,不知是否开源?

electrician 发表于 2009-6-12 15:10:53

术业有专攻!

jchqxl 发表于 2009-6-12 15:21:21

又是VC~~

WXing 发表于 2010-6-2 12:57:15

学习、

litop 发表于 2010-7-15 12:10:42

..学习,谢谢.

flyingcys 发表于 2010-7-24 12:11:39

记号!

xl7y 发表于 2010-7-24 12:59:48

不错

以后可能会用到
页: [1]
查看完整版本: 原创 vc+led显示屏+flash取图转bmp转bin