新普金娱乐网址


怎么被外国TOP3大学生高校抢着录取?分享5个学神方法论!

你的人生自由吗

用VB写高效的图像处理程序 V2.0(2006-5-24)

  • 一月 18, 2019
  • 数学
  • 没有评论

一个演唱者是咋样塑造我们的审美的

咱俩的审美无发现中会受到自己钟爱的歌手影响,TA们塑造了咱们的审美,进而改变我们从社会风气接到知识的限量,最后影响我们的思考情势。

爱好鹿晗、吴亦凡的女孩子大可能男友的外部也是这类“中性化”。而喜欢孙燕姿、ELLA的男生就会变得和我同一,更愿意团结的另一半很简短、干练。

明日在乐乎云音乐上见到了孙燕姿时隔四年的新专辑,毫不犹豫花15买了一张,第一首歌《风衣》就让我痴迷,这么长年累月了他的歌曲还会死这么好听,那多少个有磁性的动静近乎自己仍旧青春。当然比歌曲吸引自己的是特辑封面——简单中披露着性感,我认同自己盯着这张照片看了很久很久,还把它下载保存到手机里。

用VB写高效的图像处理程序 V2.0(2006-5-24)

01

小学五年级的自身,第一次走进贩卖明星卡片的小店,在成千上万女明星卡片中被唯一短发的女演员所诱惑,买了他的一套卡片——上边用复杂写着孙燕姿多少个字。这时候的我对明星不要概念,也没太把她当回事,只认为女子短发挺难堪的。

忘了过了多长时间,一起陪同学购买明星卡片的时候,突然见到旁边有个女孩子贴画特别难堪,拿起来细看更是爱不释手的要命,每张照片都那么有风味,那么有个性,原来女子短发真的可以这么帅气和可爱。问了店主才知道中贴画里的人也是孙燕姿——但怎么和自己买的卡片完全不像一个人,果然盗版害人啊!

日后我迷上了孙燕姿,脑子里一贯幻想:某一天,一个像孙燕姿一样,有着短发、身材瘦瘦的女人陪着自家。从察看她贴画的那一刻,孙燕姿就成了自我的女神。我把孙燕姿的相片贴满了书桌,还私自在语文和数学课本内页里也贴了几张——害怕别人看来说我“癞蛤蟆想吃天鹅肉”。上课无聊的时候就拿出贴纸仔细揣摩,这一个日子最喜悦的作业实在看着孙燕姿的照片对着天空傻笑了。

作者:zyl910

一、为什么这么慢?
二、DIB的结构
三、DIB访问函数
四、实战练习
五、使用DIBSection和模拟指针
六、结合DirectX

02

逐渐的,我开首关注短发、简单清洁的女子。到了初一情窦初开的年级,我一眼就一见钟情了前排的一个女子,她尽管不是短发,但很短马尾辫至少看起来比另外大部分女人简单多了,而且她长得很绝望、清新。

乘势大家聊天越来越多,她接近代表了本人心中中女神孙燕姿的身份,我对她逐步爆发了近似痴迷的珍重——上课都盯着他愣住。可女神有个一起特性——永远不能兼而有之,她最终挑选了比我帅气的男生。

这段“伪失恋”状态不断了很久,期间心疼的落泪过五回,只好靠看着孙燕姿的照片挺过这段劳累——这也让孙燕姿给自己的感触进入了自身的下意识,我起来只关注短发、简单、可爱的女子了。

初二这年,在二哥家玩的时候听到一首异常好听的歌曲,跑过去看来几个人美人在电视上帅气地跳舞,其中有个女歌星拥有和孙燕姿一样的短发看起来似乎比孙燕姿更帅气,我的秋波也直接停留在她随身。突然,她把自己的行装脱!掉!扔在地上继续唱歌——这一动作根本失守了自我,女孩子本来能够TM这么帅!

他就这样把胸罩脱掉了!!!而且还仍在地上!!!我呆呆的巡回着MV看,知道了Superstar这首歌,认识了S·H·E那多少个组合,也了然了叫埃拉(Ella)的帅气女孩子!!!第二天自己跑去盗版影象店购买了S·H·E这张专辑,并盯着专辑封面的中游地点看了好久好久。

本身心头的女神变得越来越具体——短发、帅气、有个性、利落。这些标签不断在脑公里再度,直到内化成了我心想的一有的。

一、为何如此慢?

  自盘古开天地以来(好像夸张了点),平昔有人抱怨VB程序速度慢。特别是图像处理,被认为是VB的禁区。说起来也是,市面上的关于VB的图像处理的多寡都是先讲总括公式,再一直用PSet(或API函数SetPixel)逐点画(至少我见过的书都是如此)。效果是办到了,但速度慢得离谱:对一幅640*480的图像举办半透明合并就需要10分钟;而在PhotoShop中,只要一设置图层的透明度,半透明效果即刻表现。难怪有人说VB的闲聊。

 

  但这并不意味着VB不可能写高速的图像处理程序,速度慢是因为从没行使科学的形式。

 

  从VB5方始,能以本机代码编译成exe文件,所以不设有代码执行速度的题材。那么,是何许拖慢了快慢吗?就是PSet和SetPixel!PSet把浮点形式的坐标转为像素单位,再付出SetPixel处理。而SetPixel呢,坐标系转化、剪裁区域判断、将颜色突出为设备协理的最相近的,最后还要依照不同的水彩格式寻址、为将颜色写入其所在位举办位运算。经过如此多层处理,速度不慢才怪。

 

  那么,如何才能提升处理速度呢?使用DIB,直接对位图所在内存举行操作,速度可以大大提升。现在看望本文提供的范例程序的举办进度,这只是一个简短的色彩演示程序。

 

图像尺寸:640*480*24b。单位:毫秒
  Debug Relase 说 明
1_PSet 1156.7042 936.2807 在VB使用 PSet 画的
2_SetPixelV 484.7545 460.5382 在VB使用 SetPixelV 画的
3_DIB 118.6978 3.8317 在VB使用 DIB 画的
4_DIB_Ptr 107.5791 4.3545 在VB使用 DirectDraw + 模拟指针 画的
5_DX7Ptr 108.1261 4.5503 在VB使用 DirectDraw + 模拟指针 画的
6_DX7Arr 131.8148 7.5506 在VB使用 DIBSection + GetLockedArray 画的
VC 2.8535 1.8994 用Visual C++ 6.0写的
我的电脑配置
CPU AMD Athlon XP 1700+(实际频率:1463 MHz (11 x 133))
内存 Kingston DDR266 256MB *2(两根)
显卡 nVIDIA GeForce2 MX/MX 400(AGP 4X,显存32MB)
测试环境 Windows XP sp2

图片 1
  从这些表中可寓目:
  1.VC比3_DIB、4_DIB_Ptr快一些,这是因为SafeArray结构的数组比真正的指针慢,但也不是一些人所说的70~100倍;
  2.4_DIB_Ptr比3_DIB慢一点,这是因为模仿指针本来就是靠SafeArray结构的数组,需要在运转时动态修改数组数据地址,所以速度慢一点;
  3.实在差了70~100倍是1_PSet和2_SetPixelV。
  4.在VB
IDE中解释施行顺序万分慢,3_DIB就存在30倍的快慢差异。所以平常一些猥琐的人拿
VC Debug编译的次序 与 VB IDE中表达实施顺序 相比速度。
  5.4_DIB_Ptr、5_DX7Ptr速度一样,这是因为都是行使模拟指针技术一直访问内存来做图像处理的。而6_DX7Arr使用的是Get洛克dArray重返的二维数组,二维数组比一维数组慢。

 

  以上可证,速度慢的原委是SetPixelV非凡低效,而并不是VB的题材。即使VC的实在相比较快,然则本人写这篇小说不是为着探讨速度极限(否则这篇随笔会改名为《怎么着用汇编写高速的图像处理程序》),而是为了告知我们哪些在VB中写可以实时处理的图像处理程序。

 

  同时,决定代码速度的不是编程语言或编译器,而是算法。即使算法写得差的话,无论你用怎么着编程语言或编译器,这程序速度依然很慢(你在VC中用SetPixelV写图像处理程序试试)。而前些天的硬件配置已经够用好,用VB完全可以写高速的图像处理程序。

 

03

想起自己从初一上马一向到大一追过的女子,她们清一色全是短发或短马尾,看起来也都是帅气有个性的女孩子。也正因为这多少个卓绝的精选,在心理上本人和樱木花道独一档——只有失利哪轮的上得逞!

现行想想可能是本人的人性天生内敛,我愿意我认识的人能够乐观活泼而不是像自家同一。这点模糊的同情在探望孙燕姿那一刻被具化了,看到埃拉(Ella)的那一刻升华了。这种对女性的感觉到不仅影响了本人对“美人”的定义和另一半的取舍,更影响了自己的行为艺术。

自我潜意思里默认长发的女人传统和宁静,这样的女人办事拖沓,可能还会撒娇,粘人。而短发可爱的女性则相反!在工作中我也追求简单、直接和高速,我看不惯繁杂的流水线,喜欢直达问题本质。由此毕业后自己尚未考虑去国有公司、大公司面试,我爱好简单的创业公司,这样自己可以小心于本人思维和力量的提拔,我愿意自己处理工作可以和孙燕姿、埃拉一样干净利落、简洁有力!

二、DIB的结构

  在 Windows 3.0
从前,Windows系统用的是DDB(设备有关位图)。DDB没有调色板,显示的颜色依赖硬件,处理色彩很不便利。所以
Microsoft 在 Windows 3.0中 重新定义了BMP文件格式(BMP
3.0),使其补助装备无关位图——也就是DIB。

 

  时至今天,BMP的版本号已升至5.0(Windows NT 4.0、Windows95 定义了 BMP
4.0,Windows 98、Windows 2000 定义了 BMP 5.0),但基本社团没有变——仍是
BMP文件头 和 DIB 组成:

 

BMP文件

 

BITMAPFILEHEADER

BMP文件头

DIB

BITMAPINFOHEADER

位图信息头

BITMAPINFO

RGBQUAD[]

调色板

 

位图数据

(#代表可以不填(=0)的品类)

BMP文件头——BITMAPFILEHEADER

原型定义:

typedef struct tagBITMAPFILEHEADER { // bmfh
    WORD    bfType;
    DWORD   bfSize;
    WORD    bfReserved1;
    WORD    bfReserved2;
    DWORD   bfOffBits;
} BITMAPFILEHEADER;

VB声明:

Type BITMAPFILEHEADER
    bfType(0 to 1) As Byte
    bfSize As Long
    bfReserved1 As Integer
    bfReserved2 As Integer
    bfOffBits As Long
End Type

说明:

bfType

指令文件的项目,必须是“BM”

bfSize#

指令文件的高低,包括BITMAPFILEHEADER

bfReserved1

保留,=0

bfReserved2

保留,=0

bfOffBits#

从文件头到位图数据的偏移字节数

文本信息头——BITMAPINFOHEADER

原型定义:

typedef struct tagBITMAPINFOHEADER{ // bmih
    DWORD  biSize;
    LONG   biWidth;
    LONG   biHeight;
    WORD   biPlanes;
    WORD   biBitCount;
    DWORD  biCompression;
    DWORD  biSizeImage;
    LONG   biXPelsPerMeter;
    LONG   biYPelsPerMeter;
    DWORD  biClrUsed;
    DWORD  biClrImportant;
} BITMAPINFOHEADER;

VB声明:

Type BITMAPINFOHEADER
    biSize As Long
    biWidth As Long
    biHeight As Long
    biPlanes As Integer
    biBitCount As Integer
    biCompression As Long
    biSizeImage As Long
    biXPelsPerMeter As Long
    biYPelsPerMeter As Long
    biClrUsed As Long
    biClrImportant As Long
End Type

说明:

biSize

BITMAPINFOHEADER结构的轻重。BMP有五个本子,就靠biSize来区分:
  BMP3.0:BITMAPINFOHEADER(=40)
  BMP4.0:BITMAPV4HEADER(=108)
  BMP5.0:BITMAPV5HEADER(=124)

biWidth

位图的莫大,单位是像素

biHeight

位图的小幅,单位是像素

biPlanes

设备的位平面数。现在都是1

biBitCount

图像的颜料位数
   0:当biCompression=BI_JPEG时必须为0(BMP 5.0)
   1:单色位图
   4:16色位图
   8:256色位图
  16:增强色位图,默认为555格式
  24:真彩色位图
  32:32位位图,默认意况下Windows不会处理最高8位,可以将它看作协调的Alpha通道

biCompression

减掉形式
  BI_RGB:无压缩
  BI_RLE8:行程编码压缩,biBitCount必须等于8
  BI_RLE4:行程编码压缩,biBitCount必须等于4
  BI_BITFIELDS:指定RGB掩码,biBitCount必须等于16、32
  BI_JPEG:JPEG压缩(BMP 5.0)
  BI_PNG:PNG压缩(BMP 5.0)

biSizeImage#

实质上的位图数据所占字节(biCompression=BI_RGB时能够大概)

biXPelsPerMeter#

目标设备的水平分辨率,单位是每米的像素个数

biYPelsPerMeter#

对象设备的垂直分辨率,单位是每米的像素个数

biClrUsed#

接纳的颜色数(当biBitCount等于1、4、8时才有效)。如若该项为0,表示颜色数为2^biBitCount

biClrImportant#

最首要的颜色数。倘诺该项为0,表示所有颜色都是第一的

调色板
  只有biBitCount等于1、4、8时才有调色板。调色板实际上是一个数组,元素的个数由biBitCount和biClrUsed决定。

原型定义:

typedef struct tagRGBQUAD { // rgbq
    BYTE    rgbBlue;
    BYTE    rgbGreen;
    BYTE    rgbRed;
    BYTE    rgbReserved;
} RGBQUAD;

VB声明:

Private Type RGBQUAD
    rgbBlue As Byte
    rgbGreen As Byte
    rgbRed As Byte
    rgbReserved As Byte
End Type

说明:

rgbBlue

褐色分量

rgbGreen

藏肉色分量

rgbRed

新民主主义革命分量

rgbReserved#

保留,=0

位图数据

◆扫描行:
  一行的图像数据叫做一个扫描行。一个扫描行的尺寸必须是4的倍数(字节),倘若不是,则需要补齐。总计公式:LineBytes=((biWidth*biBitCount+31)And
&HFFFFFFE0)/8
  由于BMP设定者认为数学坐标系更总要,所以DIB的扫描行是逆序存储的(相对于屏幕坐标系而言),即屏幕上的率先行是DIB位图数据的末段一行。

◆1位色:
  用1位表示一个像素,所以一个字节可以表示8个像素。坐标是从最左侧(最高位)起先的,而不是一般景观下的最低位。在内存的摆设形式如下:

字节

0

7

6

5

4

3

2

1

0

像素

0

1

2

3

4

5

6

7

◆4位色:
  用4位表示一个像素,所以一个字节可以代表2个像素。坐标是从最左侧(最高位)起头的,而不是相似情状下的最低位。在内存的布阵情势如下:

字节

0

7

6

5

4

3

2

1

0

像素

0

1

像素位

3

2

1

0

3

2

1

0

◆8位色:
  用8位表示一个像素,所以一个字节刚好只好表示一个像素。在内存的布阵模式如下:

字节

0

1

像素

0

1

◆16位色:
  用16位表示一个像素,所以五个字节可以代表1个像素。默认状况下16位DIB是555格式,最高位无效(这对VB是个福音,因为VB没有16位无符号型)。在内存的摆设形式如下(PC机使用小端规则(little
endian),是低字节在前):

字节

0

1

2

3

7

6

5

4

3

2

1

0

7

6

5

4

3

2

1

0

7

6

5

4

3

2

1

0

7

6

5

4

3

2

1

0

像素

0

1

RGB

G

B

x

R

G

G

B

x

R

G

RGB位

2

1

0

4

3

2

1

0

0

4

3

2

1

0

4

3

2

1

0

4

3

2

1

0

0

4

3

2

1

0

4

3

◆24位色:
  用24位代表一个像素,所以两个字节能够代表1个像素。注意它的依次是BGR,而不是观念的RGB。在内存的布置形式如下:

字节

0

1

2

3

4

5

像素

0

1

RGB

B

G

R

B

G

R

◆32位色:
  用32位代表一个像素,所以六个字节可以代表1个像素。注意绝大多数的GDI函数不会处理Alpha通道(只有AlphaBlend襄助)。在内存的布置形式如下:

字节

0

1

2

3

4

5

6

7

像素

0

1

RGB

B

G

R

A

B

G

R

A

04

但自身要庆幸这时候只有复读机,不至于被明星私生活等八卦污染。这样孙燕姿和埃拉给本人的痛感也一直尚未改观,尽管工作后自己也刻意制止自己去探寻她们的信息,关注他们的活着——有些觉得模糊就好,没必要那么细节,关注细节或许会让本来的痛感丧失,毕竟现在的传媒明星在哪个地方上洗手间它都能扒出来!

外表的豪华终究抵然则岁月的划痕,没有好的作品终究会被时代遗忘。但很幸运,孙燕姿和自我的偶像周杰伦一样系数,他们是的确的戏剧家,极具辨识力的鸣响配上永远优质的著述让她们的粉丝无论审美依然价值采用都有着很高的专业,换句话说孙燕姿和周杰伦是全民娱乐时代的“过滤器”。

孙燕姿看周杰伦演唱会

但埃拉(Ella)就没那么好,被迫听到很多有关他不好的音讯,尤其是近来看到她在某节目标长发造型。。。但好在女艺人孙燕姿一个就够了。

三、DIB访问函数

SetDIBitsToDevice

原型定义:

int SetDIBitsToDevice(
  HDC hDC,              // handle to device context
  int XDest,            // x-coordinate of upper-left corner of dest. rect.
  int YDest,            // y-coordinate of upper-left corner of dest. rect.
  DWORD dwWidth,        // source rectangle width
  DWORD dwHeight,       // source rectangle height
  int XSrc,             // x-coordinate of lower-left corner of source rect.
  int YSrc,             // y-coordinate of lower-left corner of source rect.
  UINT uStartScan,      // first scan line in array
  UINT cScanLines,      // number of scan lines
  CONST VOID *lpvBits,  // address of array with DIB bits
  CONST BITMAPINFO *lpbmi,  // address of structure with bitmap info.
  UINT fuColorUse       // RGB or palette indexes
);

VB声明:

Declare Function SetDIBitsToDevice Lib “gdi32.dll” (ByVal hDC As Long,
ByVal XDest As Long, ByVal YDest As Long, ByVal dwWidth As Long, ByVal
dwHeight As Long, ByVal XSrc As Long, ByVal YSrc As Long, ByVal
uStartScan As Long, ByVal cScanLines As Long, lpvBits As Any, lpbmi As
Any, ByVal fuColorUse As Long) As Long

说明:

将一幅与设施无关位图的百分之百或部分数据直接复制到一个装置。这一个函数在装置中定义了一个对象矩形,以便接受位图数据。它也在DIB中定义了一个源矩形,以便从中提取数额

返回值:

如函数执行成功,重临欲复制的扫描线的数目;如重临常数GDI_ERROR,表示出错

参数:

hDC

一个装置场景的句柄。该现象用于收纳位图数据

XDest

指定绘制区域的左上角X坐标

YDest

指定绘制区域的左上角Y坐标

dwWidth

指定绘制区域的万丈

dwHeight

点名绘制区域的小幅

XSrc

矩形在DIB中的起源X坐标

YSrc

矩形在DIB中的起点Y坐标

uStartScan

lpvBits中首先条扫描线的编号。如lpbmi之BITMAPINFOHEADER部分的biHeight字段是正数,那么这条扫描线就会从位图的底部开头总结;假虽然负数,就从顶部初始盘算

cScanLines

欲复制的扫描线数量

lpvBits

本着一个缓冲区的指针。那个缓冲区包含了以DIB格式描述的位图数据;那种格式是由lpbmi指定的

lpbmi

指向BITMAPINFO(为兼容BMP4/5而表明成Any),对DIB的格式和颜色举行描述的一个结构

fuColorUse

DIB_PAL_COLORS 颜色表是一个整数数组,其中包含了与目前选入hDC设备场景的调色板相关的索引
DIB_RGB_COLORS 颜色表包含了RGB颜色

StretchDIBits

原型定义:

int StretchDIBits(
  HDC hDC,                // handle to device context
  int XDest,              // x-coordinate of upper-left corner of dest. rectangle
  int YDest,              // y-coordinate of upper-left corner of dest. rectangle
  int nDestWidth,         // width of destination rectangle
  int nDestHeight,        // height of destination rectangle
  int XSrc,               // x-coordinate of upper-left corner of source rectangle
  int YSrc,               // y-coordinate of upper-left corner of source rectangle
  int nSrcWidth,          // width of source rectangle
  int nSrcHeight,         // height of source rectangle
  CONST VOID *lpBits,            // address of bitmap bits
  CONST BITMAPINFO *lpBitsInfo,  // address of bitmap data
  UINT iUsage,                   // usage flags
  DWORD dwRop                    // raster operation code
);

VB声明:

Declare Function StretchDIBits Lib “gdi32” (ByVal hDC As Long, ByVal
XDest As Long, ByVal YDest As Long, ByVal nDestWidth As Long, ByVal
nDestHeight As Long, ByVal XSrc As Long, ByVal YSrc As Long, ByVal
nSrcWidth As Long, ByVal nSrcHeight As Long, lpBits As Any, lpBitsInfo
As Any, ByVal wUsage As Long, ByVal dwRop As Long) As Long

说明:

基于一幅与设施无关的位图创立一幅与设施有关的位图

返回值:

推行成功重临位图句柄,零意味着失败

参数:

hDC

一个装置场景的句柄,该设备场景定义了要创立的与设施有关位图的部署信息

XDest

指定绘制区域的左上角X坐标

YDest

指定绘制区域的左上角Y坐标

nDestWidth

指定绘制区域的万丈

nDestHeight

点名绘制区域的大幅度

XSrc

矩形在DIB中的起源X坐标

YSrc

矩形在DIB中的起源Y坐标

nSrcWidth

点名原位图绘制区域的左上角X坐标

nSrcHeight

点名原位图绘制区域的左上角Y坐标

lpBits

本着一个缓冲区的指针。那多少个缓冲区包含了以DIB格式描述的位图数据;这种格式是由lpBitsInfo指定的

lpBitsInfo

指向BITMAPINFO(为兼容BMP4/5而阐明成Any),对DIB的格式和颜料举行描述的一个协会

iUsage

DIB_PAL_COLORS 颜色表是一个整数数组,其中包含了与目前选入hDC设备场景的调色板相关的索引
DIB_RGB_COLORS 颜色表包含了RGB颜色

dwRop

欲举办的光栅运算

CreateDIBitmap

原型定义:

HBITMAP CreateDIBitmap(
  HDC hDC,                  // handle to device context
  CONST BITMAPINFOHEADER *lpbmih,  // pointer to bitmap size and format data
  DWORD fdwInit,            // initialization flag
  CONST VOID *lpbInit,      // pointer to initialization data
  CONST BITMAPINFO *lpbmi,  // pointer to bitmap color-format data
  UINT fuUsage              // color-data usage
);

VB声明:

Declare Function CreateDIBitmap Lib “gdi32” (ByVal hDC As Long, lpbmih
As Any, ByVal fdwInit As Long, lpbInit As Any, lpbmi As Any, ByVal
fuUsage As Long) As Long

说明:

将一幅与设施无关位图的整整或部分数据直接复制到一个装置。这些函数在装置中定义了一个目的矩形,以便接受位图数据。它也在DIB中定义了一个源矩形,以便从中提取数据

返回值:

施行成功则赶回扫描线的多少,零象征败北。会安装GetLastError

参数:

hDC

一个设施场景的句柄。该现象用于吸纳位图数据

lpbmih

BITMAPINFOHEADER(为兼容BMP4/5而注脚成Any),对DIB的格式进行描述的一个社团

fdwInit

如不应对位图数据进行开头化,那么设为零。如设为CBM_INIT,表示遵照lpbInit和
lpbmi参数对位图举办伊始化

lpbInit

本着一个缓冲区的指针。那一个缓冲区包含了以DIB格式描述的位图数据;这种格式是由lpbmi指定的

lpbmi

指向BITMAPINFO(为兼容BMP4/5而阐明成Any),对DIB的格式和颜色实行描述的一个布局

fuUsage

DIB_PAL_COLORS 颜色表是一个整数数组,其中包含了与目前选入hDC设备场景的调色板相关的索引
DIB_RGB_COLORS 颜色表包含了RGB颜色

CreateDIBSection

原型定义:

HBITMAP CreateDIBSection(
  HDC hDC,          // handle to device context
  CONST BITMAPINFO *lpbmi,
                    // pointer to structure containing bitmap size, format, and color data
  UINT iUsage,      // color data type indicator: RGB values or palette indexes
  VOID *ppvBits,    // pointer to variable to receive a pointer to  the bitmap's bit values
  HANDLE hSection,  // optional handle to a file mapping object
  DWORD dwOffset    // offset to the bitmap bit values within the file mapping object
);

VB声明:

Declare Function CreateDIBSection Lib “gdi32” (ByVal hDC As Long, lpbmi
As Any, ByVal iUsage As Long, ByRef ppvBits As Long, ByVal hSection As
Long, ByVal dwOffset As Long) As Long

说明:

CreateDIBSection能创设一种特殊的DIB,称为DIB项(DIBSection),然后重临一个GDI位图的句柄。它提供了DIB和GDI位图的最好的风味。那样我们可以直接访问DIB的内存,可以使用位图句柄和内存设备条件,大家居然还能在DIB中调用GDI函数来绘图

返回值:

履行成功重临DIBSection位图的句柄,零意味失利。会安装GetLastError

参数:

hDC

一个配备场景的句柄。如dw设为DIB_PAL_COLORS,那么DIB颜色表就会用来自逻辑调色板的颜料举行先导化

lpbmi

指向BITMAPINFO(为兼容BMP4/5而注明成Any),这个结构伊始化成欲创造的这幅位图的配备数据

iUsage

DIB_PAL_COLORS 颜色表是一个整数数组,其中包含了与目前选入hDC设备场景的调色板相关的索引
DIB_RGB_COLORS 颜色表包含了RGB颜色

ppvBits

用于获取DIBSection数据区的内存地址

hSection

针对一个文本映射对象的可选句柄,位图将在里头创造。如设为零,Windows会自动分配内存

dwOffset

如指定了句柄,就用这多少个参数指定位图数据在文书映射对象中的偏移量

GetDIBits

原型定义:

int GetDIBits(
  HDC hDC,           // handle to device context
  HBITMAP hbmp,      // handle to bitmap
  UINT uStartScan,   // first scan line to set in destination bitmap
  UINT cScanLines,   // number of scan lines to copy
  LPVOID lpvBits,    // address of array for bitmap bits
  LPBITMAPINFO lpbmi,// address of structure with bitmap data
  UINT uUsage        // RGB or palette index
);

VB声明:

Declare Function GetDIBits Lib “gdi32” (ByVal hDC As Long, ByVal hbmp As
Long, ByVal uStartScan As Long, ByVal cScanLines As Long, lpvBits As
Any, lpbmi As Any, ByVal uUsage As Long) As Long

说明:

该函数利用申请到的内存,由GDI位图拿到DIB位图数据。通过该函数,可以对DIB的格式举行支配,可以制定颜色的位数,而且能够指定是否进行压缩。如若运用了减弱模式,则必须调用该函数一遍,一回为了获取所需内存,另外几回为了博取位图数据

返回值:

进行成功则赶回扫描线的数目,零代表失败。会设置GetLastError

参数:

hDC

概念了与装备有关位图hBitmap的布局信息的一个配备场景的句柄

hbmp

源位图的句柄

uStartScan

欲复制到DIB中的第一条扫描线的号子

cScanLines

欲复制的扫描线数量

lpvBits

针对一个缓冲区的指针。这一个缓冲区包含了以DIB格式描述的位图数据;这种格式是由lpbmi指定的

lpbmi

指向BITMAPINFO(为包容BMP4/5而声明成Any).对DIB的格式及颜色举办验证的一个构造。在BITMAPINFOHEADER结构中,从biSize到biCompression之间的具有字段都不可以不开端化

uUsage

DIB_PAL_COLORS 颜色表是一个整数数组,其中包含了与目前选入hDC设备场景的调色板相关的索引
DIB_RGB_COLORS 颜色表包含了RGB颜色

SetDIBits

原型定义:

int SetDIBits(
  HDC hDC,                  // handle to device context
  HBITMAP hbmp,             // handle to bitmap
  UINT uStartScan,          // starting scan line
  UINT cScanLines,          // number of scan lines
  CONST VOID *lpvBits,      // array of bitmap bits
  CONST BITMAPINFO *lpbmi,  // address of structure with bitmap data
  UINT uUsage               // type of color indexes to use
);

VB声明:

Declare Function SetDIBits Lib “gdi32” (ByVal hDC As Long, ByVal hbmp As
Long, ByVal uStartScan As Long, ByVal cScanLines As Long, lpvBits As
Any, lpbmi As Any, ByVal uUsage As Long) As Long

说明:

未来自与装备无关位图的二进制位复制到一幅与设施有关的位图里

返回值:

实践成功则赶回扫描线的数量,零表示退步。会安装GetLastError

参数:

hDC

概念了与设施有关位图hBitmap的配置音信的一个设备场景的句柄

hbmp

源位图的句柄

uStartScan

欲复制到DIB中的第一条扫描线的编号

cScanLines

欲复制的扫描线数量

lpvBits

针对一个缓冲区的指针。那一个缓冲区包含了以DIB格式描述的位图数据;这种格式是由lpbmi指定的

lpbmi

指向BITMAPINFO(为兼容BMP4/5而表明成Any).对DIB的格式及颜色举办表达的一个社团。在BITMAPINFOHEADER结构中,从biSize到biCompression之间的持有字段都不可能不起头化

uUsage

DIB_PAL_COLORS 颜色表是一个整数数组,其中包含了与目前选入hDC设备场景的调色板相关的索引
DIB_RGB_COLORS 颜色表包含了RGB颜色

GetDIBColorTable

原型定义:

UINT GetDIBColorTable(
  HDC hDC,          // handle to device context whose DIB is of interest
  UINT uStartIndex, // color table index of first entry to retrieve
  UINT cEntries,    // number of color table entries to retrieve
  RGBQUAD *pColors  // pointer to buffer that receives color table entries
);

VB声明:

Declare Function GetDIBColorTable Lib “gdi32” (ByVal hDC As Long, ByVal
uStartIndex As Long, ByVal cEntries As Long, pColors As RGBQUAD) As Long

说明:

从选入设备场景的DIBSection中赢得颜色表音信

返回值:

取回的水彩条目数量,零意味着失利。会安装GetLastError

参数:

hDC

已选入了一个DIBSection对象的设施场景

uStartIndex

颜色表中欲取回的首个条款的目录

cEntries

欲取回的条目数量

pColors

其一布局数组用于装载颜色表消息的第一个条款

SetDIBColorTable

原型定义:

UINT SetDIBColorTable(
  HDC hDC,                // handle to device context whose DIB is of interest
  UINT uStartIndex,       // color table index of first entry to set
  UINT cEntries,          // number of color table entries to set
  CONST RGBQUAD *pColors  // pointer to array of color table entries
);

VB声明:

Declare Function SetDIBColorTable Lib “gdi32” (ByVal hDC As Long, ByVal
uStartIndex As Long, ByVal cEntries As Long, pColors As RGBQUAD) As Long

说明:

从选入设备场景的DIBSection中赢得颜色表信息

返回值:

取回的颜色条目数量,零意味着战败。会设置GetLastError

参数:

hDC

已选入了一个DIBSection对象的装置场景

uStartIndex

颜色表中欲取回的首先个条款的目录

cEntries

欲取回的条款数量

pColors

本条社团数组用于装载颜色表音讯的率先个条文

05

娱乐圈的视听媒介可以影响大家的盘算,进而影响我们的选取,而挑选塑造了大家的人生。因而社会上主流明星的个人风格就很要紧,可方今“中性化”审美占据了主流,TFboys、鹿晗、吴亦凡、李易峰等外部更加女性的男明星成了我们的审美主流,而平等安吉拉baby、范冰冰、杨幂等有着古典美的女明星也变为了许多男生择偶的正儿八经。

这个明星都很有能力,喜欢她们也并无是非。但如若最能影响年轻人的游玩世界被这个外部看起来更加”复杂“的审美所占据,就会招致更三人沉迷于表面而忽略一个人的内在。再加上现在人有这多少个多的工具——和讯、贴吧等爱抚到一个大腕的拥有八卦,这样明星给他们的不再是一种感觉而是一种实在,但明星也是人,也会犯错,会让您错过当初这份有价值的感觉到!

这就像笔友时代,碰面意味着所有幻想的消解,只留下无趣的实际。但娱乐圈本该是我们逃避现实的地点,不仅仅是为着单纯的放松自己,也是为了通过暂停劳苦的劳作在休闲享受中找到心灵的这份感动——就像每趟听周杰伦和孙燕姿新歌的时候都给了自家追求优异的引力,毕竟我们的大脑在苏醒的时候最具创立力,也更能接受周围的感想从而发出更多的自身认知。学会和偶像保持“距离”很关键!

可实际是社会变得更为浮躁,成为国民偶像的妙法越来越低,再添加有点明星自身不检点,这样对年轻一代的成人分外不利。年长一代应该关注青少年接纳的偶像,在可以干预的初期竟可能让他们接触古典乐,到了小学阶段可以让她们接触周杰伦、王力宏、孙燕姿那些优质的偶像的著作。让男女维持和偶像的“距离”很难,毕竟网络太过便捷,既然每个人都欣赏检索自己的偶像,为何不让孩子寻找这些几乎毫无黑点的正能量明星吧?

用过苹果的无绳电话机的人再也回不到安卓,听过他们歌曲的人也再也无法承受低品位著作,由此接触事物的顺序很要紧,优先接触劣质小说而树立起的抉择标准会降低他们对自我非凡的要求,满足于低品位成功。

因而,这一切都是孙燕姿的错,让自家在那“操蛋”的社会里孤独地服从着心中的“天真”——梦想着有一天能把正价值传递给世界!

四、实战练兵

  用DIB写图像处理程序的时候,首先要明显一点:DIB并不是图像处理算法,而是一种绘图方法。图像处理算法是DIB高级,管理坐标和颜色的运算;而DIB只是为着绘制。所以此时拍卖算法的频率是速度的根本。

 

  利用DIB绘制图像并不曾比用PSet/SetPixel绘制差多少,它只是把坐标运算改成地点运算而已。很六人知情指针是一个生死攸关的东西,就是因为它能直接访问内存,如果指针不小心指错地点的话,Windows登时告知一般珍惜性错误。所以,在地点运算的时候势必要小心,同时要留意每日保存,因为此时的非法操作的发生率万分高,否则辛费力苦写的代码一刹那间没了可别怪我没指示啊。

 

  好了,现在启幕!

 

  由于拍卖算法起带领意义,所以现在先讲解1_PSet。所有的代码都在FrmMain.frm中。其他的经过的代码可以不看,现在将注意力集中在“DrawIt”中,它就是管绘制的。

 

vb6/1_PSet/FrmMain.frm中DrawIt
'绘制
Private Sub DrawIt()
    Dim I As Long, J As Long
    Static K As Long

    For I = 0 To ImgHeight - 1 'Y
        For J = 0 To ImgWidth - 1 'X
            PicView.PSet (J, I), RGB(J And &HFF, I And &HFF, (J + K) And &HFF)
        Next J
    Next I

    K = (K + 1) And &HFF

End Sub

  其实自己这多少个演示程序蛮简单的:R分量延着水平方向扩张,G分量延着垂直方向扩大,B分量则从右往左滚动。什么?!“And
&HFF”是什么样意思?!这只是基础啊……(下略&HFFFF…字)。“&H”表示十六进制数,而And表示按位与。&HFF是二进制的“1111
1111”,正好覆盖了低8位,这时用And举办按位与,只会获取低8位,与RGB分量需要的8位刚刚适合(对于“(J

  • K) And &HFF”来说,可以兑现滚动效应)。

 

  If Not 看通晓了 Then Goto 前两段

 

  好!现在开拓3_DIB。(由于24位能直接指定RGB分量,所以这边是用的是24位DIB)

 

  看了前方的“DIB的布局”,是不是有点昏呢?其实DIB也没怎么,就是
一个表述位图信息的BITMAPINFO结构 和
一个仓储位图数据的数额缓冲区,顶多再用SetDIBitsToDevice绘制,所以3_DIB与1_PSet比较只是多了SetDIBitsToDevice、BITMAPINFOHEADER(24位DIB没有调色板,所以用BITMAPINFOHEADER就行)和一部分常数的宣示而已。由于这个演示程序不需要变更图像大小和色深,所以可以把有关变量作为窗体级变量,再在Form_Load中起初化。由于DIB并不曾向系统报名资源(数组的内存是VB分配的,会自动释放),所以不需要写释放代码。

 

  现在来看DrawIt。

vb6/3_DIB/FrmMain.frm中DrawIt
'绘制
Private Sub DrawIt()
    Dim I As Long, J As Long
    Static K As Long
    Dim iLinePtr As Long, iCurPtr As Long

    iLinePtr = (m_BI.biHeight - 1) * m_LineBytes 'DIB是逆序存储的
    For I = 0 To ImgHeight - 1 'Y
        iCurPtr = iLinePtr
        For J = 0 To ImgWidth - 1 'X
            'PicView.PSet (J, I), RGB(J And &HFF, I And &HFF, (J + K) And &HFF)
            m_MapData(iCurPtr + 2) = J And &HFF       'Red
            m_MapData(iCurPtr + 1) = I And &HFF       'Green
            m_MapData(iCurPtr + 0) = (J + K) And &HFF 'Blue
            iCurPtr = iCurPtr + 3 '24位
        Next J
        iLinePtr = iLinePtr - m_LineBytes
    Next I

    K = (K + 1) And &HFF

End Sub

  1.即使可以逐点把坐标映射成地址再写,不过那样功能太低了,可以拔取坐标处理的连续性举行优化。
  2.出于自身这边用的是数组,所以这边用(数组元素)索引代替地址。
  3.最起头要留心DIB是逆序存储的,要将索引设为终极一行第一个像素的目录。
  4.由于DIB的RGB顺序是B、G、R,所以“m_MapData(CurIdx +
?)”的依次是2、1、0。
  5.设置好一个像素的颜料后,要小心把索引改为下个像素的目录。
  6.出于DIB是逆序存储的,移到下一个扫描行是“iLinePtr = iLinePtr –
m_LineBytes”

 


  “好了,代码看懂了,按F5运作看看效果。”
  “咦?速度好像没快多少啊?”


  这是出于程序在VB环境下是以表达情势运行的,而解释格局对做图像处理所急需广大循环和大量的算术运算的举办效能很低,所以要编译成(本机代码)exe再运行。此时还要小心编译优化,可以把“高级优化”的装有勾打上,速度可升级20%左右。

 

五、使用DIBSection和模拟指针

  尽管有GetDIBits/SetDIBits函数,但是DIB与GDI位图之间的数据交换仍旧很不便宜,特别处理过程中需要调用GDI函数来拍卖的时候。而且不怕你不怕麻烦,但这样做的拍卖功用很低。所以Windows为我们提供了DIBSection。DIBSection是一种新鲜的DIB,它除了可以像DIB一样从来对位图数据所占内存进行操作,它还可以够选入DC、能用GDI函数绘制,万分灵活。但在VB下利用DIBSection依然有不便的,因为用CreateDIBSection创立DIBSection时,得到的是位图数据的地址,而VB没有指针。

 

  所幸在VB下可以使用SafeArray结构的数组模拟指针。关于模拟指针的法则、方法,网上的素材多的是,比如AdamBear的文章“VB真是想不到千家万户之四:VB指针葵花宝典之SafeArray”。但这多少个著作都只是讲一般性的采纳,不能够像真的的指针一样自由更改地址(他们都是采用CopyMemory改的)。而在图像处理中,由于点运算的频繁,“像真正的指针一样随便变动地址”的功力很重点。

 

  其实“像真正的指针一样自由改动地址”并没有技术难度(对于曾经学会模拟指针的人的话),就看想取得不:直接将一个动态数组(设pByte)指向一个SAFEARRAY结构体变量(设pBytePtr)。模拟指针模块的代码在mPoint.bas

 

  现在来看4_DIB_Ptr:

vb6/4_DIB_Ptr/FrmMain.frm中DrawIt
'绘制
Private Sub DrawIt()
    Dim I As Long, J As Long
    Static K As Long
    Dim pByte() As Byte, pBytePtr As SAFEARRAY1D
    Dim iLinePtr As Long

    ' check Image
    Debug.Assert m_pDIB <> 0

    '建立模拟指针
    MakePoint VarPtrArray(pByte), pBytePtr, 1

    Ptr(pBytePtr) = m_pDIB + (m_BI.biHeight - 1) * m_LineBytes 'DIB是逆序存储的
    iLinePtr = pBytePtr.pvData
    For I = 0 To ImgHeight - 1 'Y
        pBytePtr.pvData = iLinePtr
        For J = 0 To ImgWidth - 1 'X
            'PicView.PSet (J, I), RGB(J And &HFF, I And &HFF, (J + K) And &HFF)
            pByte(2) = J And &HFF       'Red
            pByte(1) = I And &HFF       'Green
            pByte(0) = (J + K) And &HFF 'Blue
            pBytePtr.pvData = pBytePtr.pvData + 3 '24位
        Next J
        iLinePtr = iLinePtr - m_LineBytes
    Next I

    '释放模拟指针
    FreePoint VarPtrArray(pByte)

    K = (K + 1) And &HFF

End Sub

  1.为了演示DIBSection可以像HBITMAP一样,我在Form_Load中创建了DC、将DIBSection选入DC。同时为了释放,Form_UnLoad中写了自由代码。
  2.在DrawIt中,注意处理部分的代码并不曾与VB_DIB差多少,只然则把索引统计改为地点运算而已。

 

  再来相比vc的代码,感觉跟真的的指针用法差不多嘛:

vc/ImgTestDlg.cpp中CImgTestDlg::DrawIt
void CImgTestDlg::DrawIt() 
{
    int i=0,j=0;
    static int k=0;
    BYTE *pByte, *pLinePtr;

    pLinePtr = (BYTE*)pDIB + (bi.biHeight-1)*LineBytes;
    for(i=0; i<IMGHEIGHT; i++)
    {
        pByte = pLinePtr;
        for(j=0; j<IMGWIDTH; j++)
        {
            pByte[2] = j & 0xff;
            pByte[1] = i & 0xff;
            pByte[0] = (j+k) & 0xff;
            pByte = pByte + 3;
        }
        pLinePtr = pLinePtr - LineBytes;
    }

    k = (k+1) & 0xff;

}

六、结合DirectX

  在GDI中,大家可以用DIB直接操作图像数据,那么号称能一贯访问显存的DirectX呢?

 

  一查DirectX
SDK,发现IDirectDrawSurface接口的Lock函数可以锁定表面,从而一向访问该位图数据。再在VB的靶子浏览器中仔细寓目“DirectX
7 for Visual Basic Type Library”,发现DirectDrawSurface7对象也有该方法。

 

  看看5_DX7Ptr:

vb6/5_DX7Ptr/FrmMain.frm中Render
'渲染
Private Sub Render()
    Dim I As Long, J As Long
    Static K As Long
    Dim ddsdInfo As DDSURFACEDESC2
    Dim IsOK As Boolean
    Dim cbPitch As Long
    Dim cbPixel As Long
    Dim iIdxR As Long
    Dim iIdxG As Long
    Dim iIdxB As Long
    Dim iMaxX As Long, iMaxY As Long
    Dim pByte() As Byte, pBytePtr As SAFEARRAY1D
    Dim iLinePtr As Long

    ' check Image
    'Debug.Assert m_pDIB <> 0
    Debug.Assert Not m_ddsRender Is Nothing

    ' Main
    With m_ddsRender
        'Render
        Call .Lock(m_rctSurf, ddsdInfo, DDLOCK_SURFACEMEMORYPTR Or DDLOCK_WRITEONLY Or DDLOCK_NOSYSLOCK Or DDLOCK_WAIT, 0)
        IsOK = CheckPixelFormat(ddsdInfo.ddpfPixelFormat)
        If IsOK Then
            With ddsdInfo
                Debug.Assert .lpSurface
                cbPitch = .lPitch
                With .ddpfPixelFormat
                    cbPixel = (.lRGBBitCount) / 8
                    iIdxR = MaskToRShift(.lRBitMask) / 8
                    iIdxG = MaskToRShift(.lGBitMask) / 8
                    iIdxB = MaskToRShift(.lBBitMask) / 8
                End With
                iMaxX = .lWidth - 1
                iMaxY = .lHeight - 1
            End With

            '建立模拟指针
            MakePoint VarPtrArray(pByte), pBytePtr, 1

            Ptr(pBytePtr) = ddsdInfo.lpSurface
            iLinePtr = pBytePtr.pvData
            For I = 0 To iMaxY 'Y
                pBytePtr.pvData = iLinePtr
                For J = 0 To iMaxX 'X
                    'PicView.PSet (J, I), RGB(J And &HFF, I And &HFF, (J + K) And &HFF)
                    pByte(iIdxR) = J And &HFF       'Red
                    pByte(iIdxG) = I And &HFF       'Green
                    pByte(iIdxB) = (J + K) And &HFF 'Blue
                    pBytePtr.pvData = pBytePtr.pvData + cbPixel '下一个像素
                Next J
                iLinePtr = iLinePtr + cbPitch '下一个扫描行
            Next I

            '释放模拟指针
            FreePoint VarPtrArray(pByte)

        End If
        Call .Unlock(m_rctSurf)

        'Error Pixel Format
        If IsOK = False Then
            Call .BltColorFill(m_rctSurf, vbBlack)
            Call .SetForeColor(vbWhite)
            Call .DrawText(0, &H20, "Error Pixel Format!", False)
        End If

    End With

    K = (K + 1) And &HFF

End Sub

  1.出于硬件设施性能不同,所以不用期望像DIB这样可以确认RGB字节顺序。应该按照Lock方法传回的DDSURFACEDESC2结构来确认RGB字节顺序(iIdxR、iIdxG、iIdxB)、像素所占字节(cbPixel)及宽距(cbPitch)。
  2.出于大家有了仿照指针技术,所以这段代码与跟先前4_DIB_Ptr差不多,特别是与在VC中动用IDirectDrawSurface::Lock的拍卖代码差不多。

  仔细考察对象浏览器的人会发觉,DirectDrawSurface7对象GetLockedArray可以博得锁定后的位图数据:

vb6/6_DX7Arr/FrmMain.frm中Render
'渲染
Private Sub Render()
    Dim I As Long, J As Long
    Static K As Long
    Dim ddsdInfo As DDSURFACEDESC2
    Dim IsOK As Boolean
    Dim cbPitch As Long
    Dim cbPixel As Long
    Dim iIdxR As Long
    Dim iIdxG As Long
    Dim iIdxB As Long
    Dim iMaxX As Long, iMaxY As Long
    Dim pByte() As Byte
    Dim iCurPtr As Long

    ' check Image
    'Debug.Assert m_pDIB <> 0
    Debug.Assert Not m_ddsRender Is Nothing

    ' Main
    With m_ddsRender
        'Render
        Call .Lock(m_rctSurf, ddsdInfo, DDLOCK_SURFACEMEMORYPTR Or DDLOCK_WRITEONLY Or DDLOCK_NOSYSLOCK Or DDLOCK_WAIT, 0)
        IsOK = CheckPixelFormat(ddsdInfo.ddpfPixelFormat)
        If IsOK Then
            With ddsdInfo
                Debug.Assert .lpSurface
                cbPitch = .lPitch
                With .ddpfPixelFormat
                    cbPixel = (.lRGBBitCount) / 8
                    iIdxR = MaskToRShift(.lRBitMask) / 8
                    iIdxG = MaskToRShift(.lGBitMask) / 8
                    iIdxB = MaskToRShift(.lBBitMask) / 8
                End With
                iMaxX = .lWidth - 1
                iMaxY = .lHeight - 1
            End With

            Call .GetLockedArray(pByte)

            For I = 0 To iMaxY 'Y
                iCurPtr = 0
                For J = 0 To iMaxX 'X
                    'PicView.PSet (J, I), RGB(J And &HFF, I And &HFF, (J + K) And &HFF)
                    pByte(iCurPtr + iIdxR, I) = J And &HFF      'Red
                    pByte(iCurPtr + iIdxG, I) = I And &HFF      'Green
                    pByte(iCurPtr + iIdxB, I) = (J + K) And &HFF 'Blue
                    iCurPtr = iCurPtr + cbPixel '下一个像素
                Next J
            Next I

        End If
        Call .Unlock(m_rctSurf)

        'Error Pixel Format
        If IsOK = False Then
            Call .BltColorFill(m_rctSurf, vbBlack)
            Call .SetForeColor(vbWhite)
            Call .DrawText(0, &H20, "Error Pixel Format!", False)
        End If

    End With

    K = (K + 1) And &HFF

End Sub

  这多少个就是官方推荐做法,使用一个二维数组来处理位图数据。不过就是因为其利用的是二维数组,所以它比一维数组的依样画葫芦指针慢一些。假设你不想使用非凡技术(模拟指针),可以行使Get洛克(Locke)dArray。
  注意到那一点没有,Get洛克(Locke)dArray是一个模式而不是一个性能,大家需要将数组变量传递过去,然后就足以行使该数组直接操作位图数据了。啊哈!精晓了Get洛克dArray也是运用模拟指针技术实现的,只可是它填充的是2维的SAFEARRAY结构而已。

  注意:只操作位于系统内存的外部,千万别操作对显存中的表面。这是因为CPU访问显存比返问内存要慢许多!这一个指出并不是相对的,如若对该表面的Blt的调用次数远超过协调写的图像处理操作的话,可以将该表面放在显存,或者是在内存中总计好后再四遍性交给到显存。
  本程序建立图像处理操作的外部的代码:

vb6/5_DX7Ptr/FrmMain.frm中CreateSurfaces
    ' init Image
    With ddsdInfo
        .lFlags = DDSD_CAPS Or DDSD_HEIGHT Or DDSD_WIDTH Or DDSD_PIXELFORMAT
        With .ddsCaps
            .lCaps = DDSCAPS_OFFSCREENPLAIN Or DDSCAPS_SYSTEMMEMORY 'CPU访问内存比访问显存快
        End With
        .lWidth = ImgWidth
        .lHeight = ImgHeight
        .ddpfPixelFormat = m_ddsdInfo.ddpfPixelFormat
    End With
    Set m_ddsRender = m_dxDraw.CreateSurface(ddsdInfo)

(全文完)

不知晓怎么上传文件,下载请到这里:
http://blog.gameres.com/thread.asp?BlogID=2143&threadid=55903

相关文章

No Comments, Be The First!
近期评论
    分类目录
    功能
    网站地图xml地图