当前位置:C++技术网 > 精选软件 > 色彩基础知识全面了解:7 抖动色原理代码模拟实现

色彩基础知识全面了解:7 抖动色原理代码模拟实现

更新时间:2015-12-21 20:15:13浏览次数:1+次

    在文章《什么是抖动色?抖动色的形成原理是什么?抖动色有什么用?》中,我们已经详细解释了抖动色技术产生的背景和产生抖动色的原理。我通过用色轮旋转、左右摇晃脑袋和看格子衣服三个例子阐明了人眼视觉的一些特点。正是这个特点才可以实现抖动色的效果。

    我们这里就使用代码来模拟抖动色的实现。模拟的原理很简单,原理就是:水平和垂直方向上都间隔几个像素的连续画直线,直线用黑色的画就可以了。这样整个客户区被画满了横纵的直线交叉,但是因为线与线之间的距离很短,所以稍微远点看,就形成了一篇灰蒙蒙的灰色的区域。然而,我们的线都是黑色的,而看到的是一片灰色。这就是抖动色的效果。

    在windows中的抖动色,使用画刷的形式实现。画刷就是一个小位图,位图内部由一系列的点组成,根据点的颜色的多少来配比,然后用这个画刷在需要填充的区域重复的贴图,就形成了抖动色填充的效果。

    在windows中,可以使用GetNearestColor(hdc,RGB颜色值)。如果在一个颜色比较少的系统里,这样就可以用抖动色来模拟最接近于你想要设置的颜色,从而让效果更好。当然,在真彩色显示系统中,你不需要这个,因为真彩色系统的颜色够你用了。使用这个函数也非常简单,传入DC句柄和要设置的RGB颜色值,然后系统自动返回给你一个颜色,你用这个函数来画图就可以了。如果你是单色的系统,只能显示黑白的,你可以调用下面的代码来实现灰色:


COLORREF clrGray = GetNearestColor(hdc,RGB(127,127,127));
FillRect(hdc,&rect,CreateSolidBrush(clrGray));
DeleteObject(SelectObject(hdc,GetStockObject(WHITE_BRUSH)));


    我们用Win32来实现模拟,只需要在WM_PAINT消息中划线即可。下面是效果图:

【抖动色原理代码模拟实现效果图-深灰色抖动色】

【抖动色原理代码模拟实现效果图-深灰色抖动色】
    下面是完整的代码:
#include "windows.h"
#include <tchar.h>
// - 项目是Unicode字符集
LRESULT CALLBACK WinProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    TCHAR Info[100]=_T("C++技术网http://www.cjjjs.com");
    RECT rect;
    static HWND hTip=NULL;
    static POINT ptOld,ptNew;
    switch (message)
    {
     case WM_PAINT:
         {
             int s=2;//数值越大,灰度越浅
             hdc = BeginPaint(hwnd,&ps);
             GetClientRect(hwnd,&rect);

             for (int i=0;i<rect.right;i++)
             {
                 MoveToEx(hdc,i*s,0,NULL);
                 LineTo(hdc,i*s,rect.bottom);
             }
             for (int i=0;i<rect.bottom;i++)
             {
                 MoveToEx(hdc,0,i*s,NULL);
                 LineTo(hdc,rect.right,i*s);
             }
             EndPaint(hwnd,&ps);
         }
         return 0;

     case WM_DESTROY:
         PostQuitMessage(0);
         return 0;
     default:
         return DefWindowProc(hwnd, message, wParam, lParam);
    }
}