彩色图像转YUV格式序列存取(陆)

来源:互联网 发布:和邪社备用域名 编辑:程序博客网 时间:2024/05/16 17:51
  
任务:打开一幅24位彩色图像,将RGB转换为YUV格式序列,将YUV序列存储到ADO数据库中,并且同ListCtrl相关联.
 10.30           晴
作者:陆建
 
1.RGB与YUV格式序列转换
 
第一个公式是YUV转换RGB(范围0-255)时用的,第二个公式是用在YUV(601)也成为YCbCr转换RGB(范围0-255)时用的。
1.
Y = 0.299R + 0.587G + 0.114B
U = -0.147R - 0.289G + 0.436B
V = 0.615R - 0.515G - 0.100B
 
R = Y + 1.14V
G = Y - 0.39U - 0.58V
B = Y + 2.03U
2.
B= 1.164 * (Y - 16) + 2.018 * (U - 128)
G= 1.164 * (Y - 16) - 0.38 * (U - 128) - 0.813 * (V - 128)

R= 1.164 * (Y - 16) + 1.159 * (V - 128)
2.虚拟列表控件是指带有LVS_OWNERDATA风格的列表控件
    虚拟列表控件使用起来非常简单。它总共只有三个相关的消息,如果你直接使用CListCtrl,应该在对话框中响应这三个消息。如果你使用CListCtrl派生类,可以在派生类中响应这三个消息的反射消息。这三个消息分别是:
 (1)LVN_GETDISPINFO 控件请求某个数据
 (2)LVN_ODFINDITEM  查找某个数据
 (3)LVN_ODCACHEHINT 缓冲某一部分数据
我们必须响应的消息是(1),多数情况下要响应(2),极少数的情况下需要响应(3).
1、处理 LVN_GETDISPINFO 通知消息
当虚拟列表控件需要某个数据的时候,它给父窗口发送一个 LVN_GETDISPINFO通知消息,表示请求某个数据。因此列表的所有者窗口(或者它自己)必须处理这个消息。例如派生类的情况 (CMyListCtrl是一个虚拟列表类对象):
//这里处理的是反射消息
BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)
   //{{AFX_MSG_MAP(CMyListCtrl)
   ON_NOTIFY_REFLECT(LVN_GETDISPINFO, OnGetdispinfo)
   //}}AFX_MSG_MAP
END_MESSAGE_MAP()
在LVN_GETDISPINFO的处理函数中,必须首先检查列表请求的是什么数据,可能的值包括:
(1)LVIF_TEXT   必须填充 pszText
(2)LVIF_IMAGE  必须填充 iImage
(3)LVIF_INDENT 必须填充 iIndent
(4)LVIF_PARAM  必须填充 lParam
(5)LVIF_STATE  必须填充 state
根据它的请求,填充所需的数据即可。
//================= 例子代码===========================
下面的给出一个例子,填充的是列表所需的某个数据项的文字:
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
LV_ITEM* pItem= &(pDispInfo)->item;
int iItemIndx= pItem->iItem;
if (pItem->mask & LVIF_TEXT) //字符串缓冲区有效
{
switch(pItem->iSubItem){
        case 0: //
填充数据项的名字
                 text=m_database[itemid].m_one;
                     lstrcpyn(pItem->pszText, text, pItem->cchTextMax);
                     break;
        case 1: //
填充子项1
                  text=m_database[itemid].m_two;
                     lstrcpyn(pItem->pszText, text, pItem->cchTextMax);
                     break;       
 case 2: //填充子项2
                  text=m_database[itemid].m_three;
                     lstrcpyn(pItem->pszText, text, pItem->cchTextMax);
                     break;
}
    注意:在虚拟列表控件中由于对控件的属性设为OwnDtata,所以m_list.InsertItem(0,"Item   1_1");//m_list.SetItemText(0,1,0)等都不能用,通过利用MFC提供的vector类来进行数据的插入.
  
MFC对vector类的解释:
     The STL vector class is a template class of sequence containers that arrange elements of a given type in a linear arrangement andallow fast random access to any element. They should be the preferred container for a sequence when random-access performance is at a premium.
3.ADO库中包含三个基本接口:它们分别是_ConnectionPtr、_RecordsetPtr和_CommandPtr。要注意的是数据的更新,即当输出数据后弹出vector类中的数据,这我主要在OnReadaccess()构造函数中利用了vector类的pop_back()函数,同时增加了一个变量的循环判断,即循环一次递减一,来读取任意长度的数据段。
有一个问题是由于没对数据库的删除,当连续读写后程序会很大,这对文件的保存和读写很不方便,需要重新编写一下!
原创粉丝点击