一、前情回顾
前面几期我们讲了绘图,时间,颜色等各方面的函数。
我们今天将会来一些更复杂的东西——图像。
其实很早之前我们就已经说过图像了,但这次我们将会更详细地讲解图像。
二、图像处理函数
1.PIMAGE,PCIMAGE
一个保存图像的变量类型。
声明:
typedef IMAGE* PIMAGE;
typedef const IMAGE* PCIMAGE;
功能:
IMAGE 为保存图像的对象, PIMAGE 为指向该对象的指针, PCIMAGE 为指向常量对象的指针。
示例:
以下语句可以创建一个名为 pimg 的 PIMAGE 对象,尺寸为100x50:
PIMAGE pimg = newimage(100, 50);
注意,不需要时要 delimage(pimg); 来释放掉,切记。
2.newimage
功能: 这个函数创建图像,并返回图像的指针 PIMAGE。 创建后如果图像不再使用,需要使用 delimage() 销毁,防止内存泄漏。 声明:
PIMAGE newimage(); //创建大小为1x1的图像 PIMAGE newimage( //创建指定大小的图像 int width, int height );
这里有一个需要注意的地方。
之前也讲过,在定义一个PIMAGE变量时,必须有初始值newimage();
PIMAGE pimg=newimage();
否则运行时会报错。
3.delimage
销毁图像,没有什么好说的。
void EGEAPI delimage(PCIMAGE pImg); // 删除 PIMAGE
当不用一个图像时,必须把这个图像delimage掉!!!
当不用一个图像时,必须把这个图像delimage掉!!!
当不用一个图像时,必须把这个图像delimage掉!!!
(虽然我也不知道为什么,估计是会占用内存空间)
4.getimage
这个函数的花样就比较多了,所以我就直接上官方解释了。
功能: 这个函数的四个重载分别用于从窗口 / 文件 / 资源 / IMAGE 对象中获取图像 声明:
// 从窗口获取图像 int getimage( PIMAGE pDstImg, // 保存图像的 IMAGE 对象指针 int srcX, // 要获取图像的区域左上角 x 坐标 int srcY, // 要获取图像的区域左上角 y 坐标 int srcWidth, // 要获取图像的区域宽度 int srcHeight // 要获取图像的区域高度 ); // 从另一个 IMAGE 对象中获取图像 int getimage( PIMAGE pDstImg, // 保存图像的 IMAGE 对象指针 PCIMAGE pSrcImg, // 源图像 IMAGE 对象 int srcX, // 要获取图像的区域左上角 x 坐标 int srcY, // 要获取图像的区域左上角 y 坐标 int srcWidth, // 要获取图像的区域宽度 int srcHeight // 要获取图像的区域高度 ); // 从图片文件获取图像(png/bmp/jpg/gif/emf/wmf/ico) int getimage( PIMAGE pDstImg, // 保存图像的 IMAGE 对象指针 LPCTSTR pImgFile, // 图片文件名 int zoomWidth = 0, // 设定图像缩放至的宽度(0 表示默认宽度,不缩放) int zoomHeight = 0 // 设定图像缩放至的高度(0 表示默认高度,不缩放) ); // 从资源文件获取图像(png/bmp/jpg/gif/emf/wmf/ico) int getimage( PIMAGE pDstImg, // 保存图像的 IMAGE 对象指针 LPCTSTR pResType, // 资源类型 LPCTSTR pResName, // 资源名称 int zoomWidth = 0, // 设定图像缩放至的宽度(0 表示默认宽度,不缩放) int zoomHeight = 0 // 设定图像缩放至的高度(0 表示默认高度,不缩放) );参数: pimg (详见各重载函数原型内的注释) 返回值:
返回值 含义 grOk (值为 0) 读取成功 grAllocError 读取时内存分配失败 grFileNotFound 文件不存在 grNullPointer 指针转换失败 grIOerror 读取失败
这里解释的已经很清楚了,也可以看回这一期,这里就不多赘述了。
5.getimage_pngfile
顾名思义,从png文件中获取图像。
int EGEAPI getimage_pngfile(PIMAGE pimg, LPCSTR filename);
int EGEAPI getimage_pngfile(PIMAGE pimg, LPCWSTR filename);
6.putimage
这个就更多花样了,我也不说什么了。
功能: 这个函数的几个重载用于在窗口或另一个图像上绘制指定图像。 声明:
// 绘制图像到窗口 void putimage( int dstX, // 绘制位置的 x 坐标 int dstY, // 绘制位置的 y 坐标 PCIMAGE pSrcImg, // 要绘制的 IMAGE 对象指针 DWORD dwRop = SRCCOPY // 三元光栅操作码(详见备注) ); // 绘制图像到(指定宽高) void putimage( int dstX, // 绘制位置的 x 坐标 int dstY, // 绘制位置的 y 坐标 int dstWidth, // 绘制的宽度 int dstHeight, // 绘制的高度 PCIMAGE pSrcImg, // 要绘制的 IMAGE 对象指针 int srcX, // 绘制内容在 IMAGE 对象中的左上角 x 坐标 int srcY, // 绘制内容在 IMAGE 对象中的左上角 y 坐标 DWORD dwRop = SRCCOPY // 三元光栅操作码(详见备注) ); // 绘制图像到窗口(拉伸) void putimage( int dstX, // 绘制位置的 x 坐标 int dstY, // 绘制位置的 y 坐标 int dstWidth, // 绘制的宽度 int dstHeight, // 绘制的高度 PCIMAGE pSrcImg, // 要绘制的 IMAGE 对象指针 int srcX, // 绘制内容在 IMAGE 对象中的左上角 x 坐标 int srcY, // 绘制内容在 IMAGE 对象中的左上角 y 坐标 int srcWidth, // 绘制内容在源 IMAGE 对象中的宽度 int srcHeight, // 绘制内容在源 IMAGE 对象中的高度 DWORD dwRop = SRCCOPY // 三元光栅操作码(详见备注) ); // 绘制图像到另一图像 void putimage( PIMAGE pDstImg, // 目标 IMAGE 对象指针 int dstX, // 绘制位置的 x 坐标 int dstY, // 绘制位置的 y 坐标 PCIMAGE pSrcImg, // 源 IMAGE 对象指针 DWORD dwRop = SRCCOPY // 三元光栅操作码(详见备注) ); // 绘制图像到另一图像(指定宽高) void putimage( PIMAGE pDstImg, // 目标 IMAGE 对象指针 int dstX, // 绘制位置的 x 坐标 int dstY, // 绘制位置的 y 坐标 int dstWidth, // 绘制的宽度 int dstHeight, // 绘制的高度 PCIMAGE pSrcImg, // 源 IMAGE 对象指针 int srcX, // 绘制内容在源 IMAGE 对象中的左上角 x 坐标 int srcY, // 绘制内容在源 IMAGE 对象中的左上角 y 坐标 DWORD dwRop = SRCCOPY // 三元光栅操作码(详见备注) ); // 绘制图像到另一图像(拉伸) void putimage( PIMAGE pDstImg, // 目标 IMAGE 对象指针 int dstX, // 绘制位置的 x 坐标 int dstY, // 绘制位置的 y 坐标 int dstWidth, // 绘制的宽度 int dstHeight, // 绘制的高度 PCIMAGE pSrcImg, // 源 IMAGE 对象指针 int srcX, // 绘制内容在源 IMAGE 对象中的左上角 x 坐标 int srcY, // 绘制内容在源 IMAGE 对象中的左上角 y 坐标 int srcWidth, // 绘制内容在源 IMAGE 对象中的宽度 int srcHeight, // 绘制内容在源 IMAGE 对象中的高度 DWORD dwRop = SRCCOPY // 三元光栅操作码(详见备注) );参数: (详见各重载函数原型内的注释) 备注: 三元光栅操作码(即位操作模式),支持全部的 256 种三元光栅操作码,常用的几种如下:注:1. AND / OR / NOT / XOR 为布尔位运算。2. "窗口颜色"指绘制所经过的窗口像素点的颜色。3. "图像颜色"是指通过 IMAGE 对象中的图像的颜色。4. "当前填充颜色"是指通过 setfillstyle 设置的用于当前填充的颜色。5. 查看全部的三元光栅操作码请详见:三元光栅操作码。 返回值: (无) 示例: 以下局部代码读取 c:\test.jpg 绘制在窗口左上角:
值 含义 DSTINVERT 绘制出的像素颜色 = NOT 窗口颜色 MERGECOPY 绘制出的像素颜色 = 图像颜色 AND 当前填充颜色 MERGEPAINT 绘制出的像素颜色 = 窗口颜色 OR (NOT 图像颜色) NOTSRCCOPY 绘制出的像素颜色 = NOT 图像颜色 NOTSRCERASE 绘制出的像素颜色 = NOT (窗口颜色 OR 图像颜色) PATCOPY 绘制出的像素颜色 = 当前填充颜色 PATINVERT 绘制出的像素颜色 = 窗口颜色 XOR 当前填充颜色 PATPAINT 绘制出的像素颜色 = 窗口颜色 OR ((NOT 图像颜色) OR 当前填充颜色) SRCAND 绘制出的像素颜色 = 窗口颜色 AND 图像颜色 SRCCOPY 绘制出的像素颜色 = 图像颜色 SRCERASE 绘制出的像素颜色 = (NOT 窗口颜色) AND 图像颜色 SRCINVERT 绘制出的像素颜色 = 窗口颜色 XOR 图像颜色 SRCPAINT 绘制出的像素颜色 = 窗口颜色 OR 图像颜色 PIMAGE img = newimage(); if (getimage(img, "c:\\test.jpg")!= grOk) { //读取图片文件失败 exit(-1); } putimage(0, 0, img); delimage(img); 以下局部代码将窗口 (0,0) 起始的长宽各 100 像素的图像拷贝至 (200,200) 位置: PIMAGE img = newimage(); getimage(img, 0, 0, 100, 100); putimage(200, 200, img);delimage(img);
这里提到了三元光栅,那么这是什么呢,我们等一下再说。
7.putimage_withalpha
功能: 绘制带透明通道的图像 声明:
int putimage_withalpha( PIMAGE imgdest, // 目标 IMAGE 对象指针 PCIMAGE imgsrc, // 源 IMAGE 对象指针 int nXOriginDest, // 绘制位置的 x 坐标 int nYOriginDest, // 绘制位置的 y 坐标 int nXOriginSrc = 0, // 绘制内容在 IMAGE 对象中的左上角 x 坐标 int nYOriginSrc = 0, // 绘制内容在 IMAGE 对象中的左上角 y 坐标 int nWidthSrc = 0, // 绘制内容在源 IMAGE 对象中的宽度 int nHeightSrc = 0 // 绘制内容在源 IMAGE 对象中的高度 ); int putimage_withalpha( PIMAGE imgdest, // 目标 IMAGE 对象指针 PCIMAGE imgsrc, // 源 IMAGE 对象指针 int nXOriginDest, // 绘制位置的 x 坐标 int nYOriginDest, // 绘制位置的 y 坐标 int nWidthDest, // 绘制内容在目标 IMAGE 对象中的宽度 int nHeightDest, // 绘制内容在目标 IMAGE 对象中的高度 int nXOriginSrc, // 绘制内容在 IMAGE 对象中的左上角 x 坐标 int nYOriginSrc, // 绘制内容在 IMAGE 对象中的左上角 y 坐标 int nWidthSrc, // 绘制内容在源 IMAGE 对象中的宽度 int nHeightSrc // 绘制内容在源 IMAGE 对象中的高度 );参数:
imgdest 要进行半透明混合的目标图片,如果为NULL则表示操作窗口上的图片 imgsrc 要进行半透明混合的源图片,该操作不会改变源图片
nXOriginDest, nYOriginDest 要开始进行混合的目标图片坐标,该坐标是混合区域的左上角 nWidthDest, nHeightDest 要开始进行混合的目标矩形区域大小 alpha 透明度值,如果为0x0,表示源图片完全透明,如果为0xFF,表示源图片完全不透明。
nXOriginDest, nYOriginDest, nWidthDest, nHeightDest 描述要进行此操作的源图矩形区域。如果nWidthDest和nHeightDest 为0,表示操作整张图片。
返回值: 成功返回0,否则返回非0,若imgdest或imgsrc传入错误,会引发运行时异常。
8.putimage_alphablend
功能: 对两张图片进行半透明混合,并把混合结果写入目标图片。 声明:
int putimage_alphablend( PIMAGE imgdest, // 目标 IMAGE 对象指针 PCIMAGE imgsrc, // 源 IMAGE 对象指针 int nXOriginDest, // 绘制位置的 x 坐标 int nYOriginDest, // 绘制位置的 y 坐标 unsigned char alpha, // 透明度值 int nXOriginSrc = 0, // 绘制内容在 IMAGE 对象中的左上角 x 坐标 int nYOriginSrc = 0, // 绘制内容在 IMAGE 对象中的左上角 y 坐标 int nWidthSrc = 0, // 绘制内容在源 IMAGE 对象中的宽度 int nHeightSrc = 0 // 绘制内容在源 IMAGE 对象中的高度 );参数:
imgdest 要进行半透明混合的目标图片,如果为 NULL 则表示操作窗口上的图片
imgsrc 要进行半透明混合的源图片,该操作不会改变源图片
nXOriginDest, nYOriginDest 要开始进行混合的目标图片坐标,该坐标是混合区域的左上角
alpha 透明度值,如果为 0x0,表示源图片完全透明,如果为 0xFF,表示源图片完全不透明。
nXOriginDest, nYOriginDest, nWidthDest, nHeightDest 描述要进行此操作的源图矩形区域。如果 nWidthDest 和 nHeightDest 为 0,表示操作整张图片。
返回值: 成功返回 0,否则返回非 0,若 imgdest 或 imgsrc 传入错误,会引发运行时异常。
9.putimage_alphafilter
我只能说,接下来的操作就越来越奇怪了,一般人大概率用不到。
所以就当看看就好。
功能: 根据一张图像提供的 Alpha,将源图像和目标图像进行混合,并把混合结果写入目标图像。 声明: int putimage_alphafilter( PIMAGE imgdest, // 目标 IMAGE 对象指针 PCIMAGE imgsrc, // 源 IMAGE 对象指针 int nXOriginDest, // 绘制位置的 x 坐标 int nYOriginDest, // 绘制位置的 y 坐标 PCIMAGE imgalpha, // 提供透明度(alpha)值的图像 int nXOriginSrc, // 绘制内容在 IMAGE 对象中的左上角 x 坐标 int nYOriginSrc, // 绘制内容在 IMAGE 对象中的左上角 y 坐标 int nWidthSrc, // 绘制内容在源 IMAGE 对象中的宽度 int nHeightSrc // 绘制内容在源 IMAGE 对象中的高度 );
参数:
imgdest 要进行半透明混合的目标图片,如果为 NULL 则表示操作窗口上的图片
imgsrc 要进行半透明混合的源图片,该操作不会改变源图片
nXOriginDest, nYOriginDest 要开始进行混合的目标图片坐标,该坐标是混合区域的左上角
imgalpha 提供透明度(alpha)值的图像。图像中像素值不再作为颜色,而是取低 8 位(取值范围:0 到 255)做为 alpha 值。
nXOriginDest, nYOriginDest, nWidthDest, nHeightDest 描述要进行此操作的源图矩形区域。如果 nWidthDest 和 nHeightDest 为 0,表示操作整张图片。
返回值: 成功返回 0,否则返回非 0,若 imgdest 或 imgsrc 传入错误,会引发运行时异常。
10.putimage_transparent
功能: 对两张图片进行透明混合,并把混合结果写入目标图片。 声明: int putimage_transparent( PIMAGE imgdest, // 目标 IMAGE 对象指针 PCIMAGE imgsrc, // 源 IMAGE 对象指针 int nXOriginDest, // 绘制位置的 x 坐标 int nYOriginDest, // 绘制位置的 y 坐标 color_t crTransparent, // 变为透明的像素颜色 int nXOriginSrc = 0, // 绘制内容在 IMAGE 对象中的左上角 x 坐标 int nYOriginSrc = 0, // 绘制内容在 IMAGE 对象中的左上角 y 坐标 int nWidthSrc = 0, // 绘制内容在源 IMAGE 对象中的宽度 int nHeightSrc = 0 // 绘制内容在源 IMAGE 对象中的高度 );
参数:
imgdest 要进行透明混合的目标图片,如果为NULL则表示操作窗口上的图片
imgsrc 要进行透明混合的源图片,该操作不会改变源图片
nXOriginDest, nYOriginDest 要开始进行混合的目标图片坐标,该坐标是混合区域的左上角
crTransparent 关键色。源图片上为该颜色值的像素,将忽略,不会改写目标图片上相应位置的像素。
nXOriginDest, nYOriginDest, nWidthDest, nHeightDest 描述要进行此操作的源图矩形区域。如果nWidthDest和nHeightDest 为0,表示操作整张图片。
返回值: 成功返回0,否则返回非0,若imgdest或imgsrc传入错误,会引发运行时异常。
11.putimage_alphatransparent
功能: 对两张图片进行透明/半透明混合,并把混合结果写入目标图片。 声明: int putimage_alphatransparent( PIMAGE imgdest, // 目标 IMAGE 对象指针 PCIMAGE imgsrc, // 源 IMAGE 对象指针 int nXOriginDest, // 绘制位置的 x 坐标 int nYOriginDest, // 绘制位置的 y 坐标 color_t crTransparent, // 变为透明的像素颜色 unsigned char alpha, // 透明度值 int nXOriginSrc = 0, // 绘制内容在 IMAGE 对象中的左上角 x 坐标 int nYOriginSrc = 0, // 绘制内容在 IMAGE 对象中的左上角 y 坐标 int nWidthSrc = 0, // 绘制内容在源 IMAGE 对象中的宽度 int nHeightSrc = 0 // 绘制内容在源 IMAGE 对象中的高度 );
参数:
imgdest 要进行半透明混合的目标图片,如果为NULL则表示操作窗口上的图片
imgsrc 要进行半透明混合的源图片,该操作不会改变源图片
nXOriginDest, nYOriginDest 要开始进行混合的目标图片坐标,该坐标是混合区域的左上角
crTransparent 关键色。源图片上为该颜色值的像素,将忽略,不会改写目标图片上相应位置的像素。
alpha 透明度值,如果为0x0,表示源图片完全透明,如果为0xFF,表示源图片完全不透明。
nXOriginDest, nYOriginDest, nWidthDest, nHeightDest 描述要进行此操作的源图矩形区域。如果nWidthDest和nHeightDest 为0,表示操作整张图片。
返回值: 成功返回0,否则返回非0,若imgdest或imgsrc传入错误,会引发运行时异常。
12.putimage_rotate
这个函数就比较常用了,只是有点复杂。
功能: 绘制旋转后的图像 声明: int putimage_rotate( PIMAGE imgdest, // 目标 IMAGE 对象指针 PCIMAGE PIMAGE imgtexture, // 纹理IMAGE 对象指针 int nXOriginDest, // 绘制位置的 x 坐标 int nYOriginDest, // 绘制位置的 y 坐标 float centerx, // 旋转中心在源图像纹理坐标系上的x坐标 float centery, // 旋转中心在源图像纹理坐标系上的y坐标 float radian, // 旋转弧度 int btransparent = 0, // 是否允许图像透明通道 int alpha = -1, // 透明度 int smooth = 0 // 是否进行平滑处理 );
参数:
imgdest 绘制的目标图像,如果为NULL则绘制到窗口
imgtexture 要绘制的源图像,该操作不会改变源图像
nXOriginDest, nYOriginDest 旋转中心在目标图像上的位置
centerx, certery 旋转中心在源图像纹理坐标系上的位置
radian 旋转的弧度
btransparent 是否允许图像透明通道, 设置为1可以绘制带透明通道的纹理图像,设置为0时忽略图像的透明通道。
alpha 设置图像透明度值,如果为0x0,表示源图片完全透明,如果为0xFF,表示源图片完全不透明,-1表示不进行透明处理。
smooth 是否对图像进行平滑处理。旋转后绘制出的图像可能带有锯齿,失真。
返回值: 成功返回0,否则返回非0,若imgdest或imgsrc传入错误,会引发运行时异常。
13. putimage_rotatetransparent
功能: 将一个图像(源图像)缩放旋转后复制到目标图像上。 声明: int putimage_rotatetransparent( PIMAGE imgdest, // 目的图像指针, NULL表示窗口 PCIMAGE imgsrc, // 源图像指针 int xCenterDest, // 旋转中心在目的图像的x坐标 int yCenterDest, // 旋转中心在目的图像的y坐标 int xCenterSrc, // 源图像旋转中心的x坐标 int yCenterSrc, // 源图像旋转中心的y坐标 color_t crTransparent, // 源图像透明背景色 float radian, // 顺时针旋转角度(弧度) float zoom=1.0 // 缩放因子 int nWidthSrc = 0, // 绘制内容在源 IMAGE 对象中的宽度 int nHeightSrc = 0 // 绘制内容在源 IMAGE 对象中的高度 ); int putimage_rotatetransparent( PIMAGE imgdest, // 目的图像指针, NULL表示窗口 PCIMAGE imgsrc, // 源图像指针 int xCenterDest, // 旋转中心在目的图像的x坐标 int yCenterDest, // 旋转中心在目的图像的y坐标 int xOriginSrc, // 源图像复制区域左上角x坐标 int yOriginSrc, // 源图像复制区域左上角y坐标 int widthSrc, // 源图像复制区域宽度 int heightSrc, // 源图像复制区域高度 int xCenterSrc, // 源图像旋转中心的x坐标 int yCenterSrc, // 源图像旋转中心的y坐标 color_t crTransparent, // 源图像透明背景色 float radian, // 顺时针旋转角度(弧度) float zoom=1.0 // 缩放因子 int nWidthSrc = 0, // 绘制内容在源 IMAGE 对象中的宽度 int nHeightSrc = 0 // 绘制内容在源 IMAGE 对象中的高度 );
参数:
imgdest 要被复制到的目标图像,如果为NULL则表示操作窗口上的图像
imgsrc 被赋值的源图像,该操作不会改变源图像内容。
xCenterDest, yCenterDest 复制后旋转中心在目标图像上的位置
xCenterSrc, yCenterSrc 旋转中心在源图像上的位置
crTransparent 透明背景色。源图像上为该颜色值的像素,将忽略,不会改写目标图像上相应位置的像素。
xOriginSrc, yOriginSrc, widthSrc, heightSrc 描述要进行此操作的源图像矩形区域。
radian 源图像复制时的旋转角度。单位为弧度。当此值为正时,按顺时针方向旋转。
zoom 源图像复制时的放大倍数。
返回值: 成功返回0,否则返回非0,若imgdest或imgsrc传入错误,会引发运行时异常。
14.resize
接下来就回归正常了。
功能: 调整图像的尺寸,调整后,图像用背景色填充,视口还原为初始状态。 声明:
int resize( PIMAGE pimg, int width, int height );参数: pimg 要调整大小的图像,不能为NULL。 width, height 图像新尺寸
返回值: 成功返回0,否则返回非0,若 pimg 传入错误,会引发运行时异常。
15.resize_f
功能: 调整图像的尺寸,调整后,图像内容未定义,视口还原为初始状态。 声明:
int resize( PIMAGE pimg, int width, int height );参数: pimg 要调整大小的图像,不能为 NULL。 width, height 图像新尺寸
返回值: 成功返回 0,否则返回非 0,若 pimg 传入错误,会引发运行时异常。
16.getwidth,getheight
这两个函数既可以获取窗口宽度(高度),也可以获取图像宽度(高度)。
int EGEAPI getwidth(PCIMAGE pimg = NULL); // 获取图片宽度
int EGEAPI getheight(PCIMAGE pimg = NULL); // 获取图片高度
当pimg为默认值NULL时,返回窗口宽度(高度)。
17.getbuffer
功能: 获取图像的缓存区。 声明:
color_t* getbuffer( PIMAGE pimg ); color_t* getbuffer( PCIMAGE pimg );参数: pimg 要获取缓存区的图像,默认值为 NULL (窗口)。
返回值: 图像缓存区首地址,缓存区为一维数组,大小为 图像宽度*图像高度。 在图像中坐标为(x, y) 的像素,为buff[y * width + x];
18.saveimage
功能: 将图像保存到文件中。目前只能保存成BMP或者PNG格式。 声明:
int saveimage( PCIMAGE pimg, LPCSTR filename ); int saveimage( PCIMAGE pimg, LPCWSTR filename );参数:
pimg 要保存的图像
filename 保存的图像文件名 如果文件名以.bmp 结尾,则保存成 BMP 格式。 如果文件名以.png 结尾,则保存成 PNG 格式。 无后缀名或者其他后缀名,则保存成 PNG 格式。
返回值: 成功返回 grOk(0),否则返回非 0 值,若 pimg 传入错误,会引发运行时异常。
19.savepng
功能: 将图像保存到文件中。 声明:
int savepng( PCIMAGE pimg, LPCSTR filename, int bAlpha = 0 ); int savepng( PCIMAGE pimg, LPCWSTR filename, int bAlpha = 0 );参数:
pimg 要保存的图像
filename 保存的图像文件名
bAlpha 设置保存图像的透明度,范围从0 到 255
返回值: 成功返回0,否则返回非0,若pimg传入错误,会引发运行时异常。
(不如saveimage,但方便一点)
20.imagefilter_blurring
功能: 对一图片区域进行模糊滤镜操作 声明: int imagefilter_blurring ( PIMAGE imgdest, int intensity, int alpha, int nXOriginDest = 0, int nYOriginDest = 0, int nWidthDest = 0, int nHeightDest = 0 );参数:
imgdest 要进行模糊操作的图片,如果为NULL则表示操作窗口上的图片
intensity 模糊度,值越大越模糊。当值在 0x0 - 0x7F之间时,为四向模糊;当值在 0x80 - 0xFF之间时,为八向模糊,运算量会大一倍 alpha 图像亮度。取值为0x100表示亮度不变,取值为0x0表示图像变成纯黑
nXOriginDest, nYOriginDest, nWidthDest, nHeightDest 描述要进行此操作的矩形区域。如果nWidthDest和nHeightDest 为0,表示操作整张图片。
返回值: 成功返回0,否则返回非0,若imgdest传入错误,会引发运行时异常。
三、三元光栅操作码
最后,我们再来讲讲三元光栅。
三元指D(目标图像)、P(当前填充颜色)、S(源图像)这三个元素(就像三元一次方程的三元指有三个变量元素)
光栅指掩码图(也称为遮罩图),物理上光栅有选择透光的功能。
三元光栅投影透明图片的原理可以从现实层面来理解,就是源图像的光透过掩码图构成的光栅选择性投射到目标图像(画板,背景)上。更形象的一种说法是,源图像的光透过镂空的掩码图只在目标图像上显现出掩码图镂空出来的部分(但这个比喻其实已经与光栅不太符合了,只能叫挡板)
(原文链接:https://blog.csdn.net/q781634081/article/details/108109556)
三元光栅操作码定义了源图像与屏幕图像的位合并形式,这个合并形式是以下三个操作数对应像素的布尔运算:
布尔运算符包括以下几种:
操作数 含义 D 屏幕图像 P 当前填充颜色 S 源图像 所有的布尔操作都采用逆波兰表示法,例如,“当前填充颜色 or 源图像”可表示为:PSo。(当然 SPo 也是等价的,这里只列举出了其中一种等价格式) 三元光栅操作码是 32位int 类型,其高位字是布尔操作索引,低位字是操作码。布尔操作索引的 16 个位中,高 8 位用 0 填充,低 8 位是当前填充颜色、源图像和屏幕的布尔操作结果。例如,PSo 和 DPSoo 的操作索引如下:
操作 含义 a 位的 AND 运算(双目运算) n 位的 NOT 运算(单目运算) o 位的 OR 运算(双目运算) x 位的 XOR 运算(双目运算) 上例中,PSo 的操作索引是 00FC (从下往上读),DPSoo 的是 00FE。这些值定义了相应的三元光栅操作码在“三元光栅操作码”表格中的位置,PSo 在 252 (00FCh) 行,DPSoo 在 254 (00FEh) 行。常用的三元光栅操作码已经定义了常量名,程序中可以直接使用。 三元光栅操作码
P S D PSo DPSoo 0 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 1 1 1 1 1 0 0 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 1 1 操作索引: 00FCh 00FEh
布尔功能 (16 进制) 光栅操作 (16 进制) 布尔功能的逆波兰表示法 常量名 00 00000042 0 BLACKNESS 01 00010289 DPSoon 02 00020C89 DPSona 03 000300AA PSon 04 00040C88 SDPona 05 000500A9 DPon 06 00060865 PDSxnon 07 000702C5 PDSaon 08 00080F08 SDPnaa 09 00090245 PDSxon 0A 000A0329 DPna 0B 000B0B2A PSDnaon 0C 000C0324 SPna 0D 000D0B25 PDSnaon 0E 000E08A5 PDSonon 0F 000F0001 Pn 10 00100C85 PDSona 11 001100A6 DSon NOTSRCERASE 12 00120868 SDPxnon 13 001302C8 SDPaon 14 00140869 DPSxnon 15 001502C9 DPSaon 16 00165CCA PSDPSanaxx 17 00171D54 SSPxDSxaxn 18 00180D59 SPxPDxa 19 00191CC8 SDPSanaxn 1A 001A06C5 PDSPaox 1B 001B0768 SDPSxaxn 1C 001C06CA PSDPaox 1D 001D0766 DSPDxaxn 1E 001E01A5 PDSox 1F 001F0385 PDSoan 20 00200F09 DPSnaa 21 00210248 SDPxon 22 00220326 DSna 23 00230B24 SPDnaon 24 00240D55 SPxDSxa 25 00251CC5 PDSPanaxn 26 002606C8 SDPSaox 27 00271868 SDPSxnox 28 00280369 DPSxa 29 002916CA PSDPSaoxxn 2A 002A0CC9 DPSana 2B 002B1D58 SSPxPDxaxn 2C 002C0784 SPDSoax 2D 002D060A PSDnox 2E 002E064A PSDPxox 2F 002F0E2A PSDnoan 30 0030032A PSna 31 00310B28 SDPnaon 32 00320688 SDPSoox 33 00330008 Sn NOTSRCCOPY 34 003406C4 SPDSaox 35 00351864 SPDSxnox 36 003601A8 SDPox 37 00370388 SDPoan 38 0038078A PSDPoax 39 00390604 SPDnox 3A 003A0644 SPDSxox 3B 003B0E24 SPDnoan 3C 003C004A PSx 3D 003D18A4 SPDSonox 3E 003E1B24 SPDSnaox 3F 003F00EA PSan 40 00400F0A PSDnaa 41 00410249 DPSxon 42 00420D5D SDxPDxa 43 00431CC4 SPDSanaxn 44 00440328 SDna SRCERASE 45 00450B29 DPSnaon 46 004606C6 DSPDaox 47 0047076A PSDPxaxn 48 00480368 SDPxa 49 004916C5 PDSPDaoxxn 4A 004A0789 DPSDoax 4B 004B0605 PDSnox 4C 004C0CC8 SDPana 4D 004D1954 SSPxDSxoxn 4E 004E0645 PDSPxox 4F 004F0E25 PDSnoan 50 00500325 PDna 51 00510B26 DSPnaon 52 005206C9 DPSDaox 53 00530764 SPDSxaxn 54 005408A9 DPSonon 55 00550009 Dn DSTINVERT 56 005601A9 DPSox 57 00570389 DPSoan 58 00580785 PDSPoax 59 00590609 DPSnox 5A 005A0049 DPx PATINVERT 5B 005B18A9 DPSDonox 5C 005C0649 DPSDxox 5D 005D0E29 DPSnoan 5E 005E1B29 DPSDnaox 5F 005F00E9 DPan 60 00600365 PDSxa 61 006116C6 DSPDSaoxxn 62 00620786 DSPDoax 63 00630608 SDPnox 64 00640788 SDPSoax 65 00650606 DSPnox 66 00660046 DSx SRCINVERT 67 006718A8 SDPSonox 68 006858A6 DSPDSonoxxn 69 00690145 PDSxxn 6A 006A01E9 DPSax 6B 006B178A PSDPSoaxxn 6C 006C01E8 SDPax 6D 006D1785 PDSPDoaxxn 6E 006E1E28 SDPSnoax 6F 006F0C65 PDSxnan 70 00700CC5 PDSana 71 00711D5C SSDxPDxaxn 72 00720648 SDPSxox 73 00730E28 SDPnoan 74 00740646 DSPDxox 75 00750E26 DSPnoan 76 00761B28 SDPSnaox 77 007700E6 DSan 78 007801E5 PDSax 79 00791786 DSPDSoaxxn 7A 007A1E29 DPSDnoax 7B 007B0C68 SDPxnan 7C 007C1E24 SPDSnoax 7D 007D0C69 DPSxnan 7E 007E0955 SPxDSxo 7F 007F03C9 DPSaan 80 008003E9 DPSaa 81 00810975 SPxDSxon 82 00820C49 DPSxna 83 00831E04 SPDSnoaxn 84 00840C48 SDPxna 85 00851E05 PDSPnoaxn 86 008617A6 DSPDSoaxx 87 008701C5 PDSaxn 88 008800C6 DSa SRCAND 89 00891B08 SDPSnaoxn 8A 008A0E06 DSPnoa 8B 008B0666 DSPDxoxn 8C 008C0E08 SDPnoa 8D 008D0668 SDPSxoxn 8E 008E1D7C SSDxPDxax 8F 008F0CE5 PDSanan 90 00900C45 PDSxna 91 00911E08 SDPSnoaxn 92 009217A9 DPSDPoaxx 93 009301C4 SPDaxn 94 009417AA PSDPSoaxx 95 009501C9 DPSaxn 96 00960169 DPSxx 97 0097588A PSDPSonoxx 98 00981888 SDPSonoxn 99 00990066 DSxn 9A 009A0709 DPSnax 9B 009B07A8 SDPSoaxn 9C 009C0704 SPDnax 9D 009D07A6 DSPDoaxn 9E 009E16E6 DSPDSaoxx 9F 009F0345 PDSxan A0 00A000C9 DPa A1 00A11B05 PDSPnaoxn A2 00A20E09 DPSnoa A3 00A30669 DPSDxoxn A4 00A41885 PDSPonoxn A5 00A50065 PDxn A6 00A60706 DSPnax A7 00A707A5 PDSPoaxn A8 00A803A9 DPSoa A9 00A90189 DPSoxn AA 00AA0029 D AB 00AB0889 DPSono AC 00AC0744 SPDSxax AD 00AD06E9 DPSDaoxn AE 00AE0B06 DSPnao AF 00AF0229 DPno B0 00B00E05 PDSnoa B1 00B10665 PDSPxoxn B2 00B21974 SSPxDSxox B3 00B30CE8 SDPanan B4 00B4070A PSDnax B5 00B507A9 DPSDoaxn B6 00B616E9 DPSDPaoxx B7 00B70348 SDPxan B8 00B8074A PSDPxax B9 00B906E6 DSPDaoxn BA 00BA0B09 DPSnao BB 00BB0226 DSno MERGEPAINT BC 00BC1CE4 SPDSanax BD 00BD0D7D SDxPDxan BE 00BE0269 DPSxo BF 00BF08C9 DPSano C0 00C000CA PSa MERGECOPY C1 00C11B04 SPDSnaoxn C2 00C21884 SPDSonoxn C3 00C3006A PSxn C4 00C40E04 SPDnoa C5 00C50664 SPDSxoxn C6 00C60708 SDPnax C7 00C707AA PSDPoaxn C8 00C803A8 SDPoa C9 00C90184 SPDoxn CA 00CA0749 DPSDxax CB 00CB06E4 SPDSaoxn CC 00CC0020 S SRCCOPY CD 00CD0888 SDPono CE 00CE0B08 SDPnao CF 00CF0224 SPno D0 00D00E0A PSDnoa D1 00D1066A PSDPxoxn D2 00D20705 PDSnax D3 00D307A4 SPDSoaxn D4 00D41D78 SSPxPDxax D5 00D50CE9 DPSanan D6 00D616EA PSDPSaoxx D7 00D70349 DPSxan D8 00D80745 PDSPxax D9 00D906E8 SDPSaoxn DA 00DA1CE9 DPSDanax DB 00DB0D75 SPxDSxan DC 00DC0B04 SPDnao DD 00DD0228 SDno DE 00DE0268 SDPxo DF 00DF08C8 SDPano E0 00E003A5 PDSoa E1 00E10185 PDSoxn E2 00E20746 DSPDxax E3 00E306EA PSDPaoxn E4 00E40748 SDPSxax E5 00E506E5 PDSPaoxn E6 00E61CE8 SDPSanax E7 00E70D79 SPxPDxan E8 00E81D74 SSPxDSxax E9 00E95CE6 DSPDSanaxxn EA 00EA02E9 DPSao EB 00EB0849 DPSxno EC 00EC02E8 SDPao ED 00ED0848 SDPxno EE 00EE0086 DSo SRCPAINT EF 00EF0A08 SDPnoo F0 00F00021 P PATCOPY F1 00F10885 PDSono F2 00F20B05 PDSnao F3 00F3022A PSno F4 00F40B0A PSDnao F5 00F50225 PDno F6 00F60265 PDSxo F7 00F708C5 PDSano F8 00F802E5 PDSao F9 00F90845 PDSxno FA 00FA0089 DPo FB 00FB0A09 DPSnoo PATPAINT FC 00FC008A PSo FD 00FD0A0A PSDnoo FE 00FE02A9 DPSoo FF 00FF0062 1 WHITENESS
四、附录
函数声明:
//图片函数
#define getmaxx getwidth
#define getmaxy getheight
int EGEAPI getwidth(PCIMAGE pimg = NULL); // 获取图片宽度
int EGEAPI getheight(PCIMAGE pimg = NULL); // 获取图片高度
int EGEAPI getx(PCIMAGE pimg = NULL); // 获取当前 x 坐标
int EGEAPI gety(PCIMAGE pimg = NULL); // 获取当前 y 坐标
PIMAGE EGEAPI newimage(); // 创建 PIMAGE
PIMAGE EGEAPI newimage(int width, int height); // 创建 PIMAGE
void EGEAPI delimage(PCIMAGE pImg); // 删除 PIMAGE
color_t* EGEAPI getbuffer(PIMAGE pImg);
const color_t* EGEAPI getbuffer(PCIMAGE pImg);
int EGEAPI resize_f(PIMAGE pDstImg, int width, int height); //重设尺寸,但不填充背景色
int EGEAPI resize(PIMAGE pDstImg, int width, int height); //重设尺寸,并填充背景色
int EGEAPI getimage(PIMAGE pDstImg, int srcX, int srcY, int srcWidth, int srcHeight); // 从屏幕获取图像
int EGEAPI getimage(PIMAGE pDstImg, PCIMAGE pSrcImg, int srcX, int srcY, int srcWidth, int srcHeight); // 从另一个 PIMAGE 对象中获取图像
int EGEAPI getimage(PIMAGE pDstImg, LPCSTR pImgFile, int zoomWidth = 0, int zoomHeight = 0); // 从图片文件获取图像(bmp/jpg/gif/emf/wmf)
int EGEAPI getimage(PIMAGE pDstImg, LPCWSTR pImgFile, int zoomWidth = 0, int zoomHeight = 0); // 从图片文件获取图像(bmp/jpg/gif/emf/wmf)
int EGEAPI getimage(PIMAGE pDstImg, LPCSTR pResType, LPCSTR pResName, int zoomWidth = 0, int zoomHeight = 0); // 从资源文件获取图像(bmp/jpg/gif/emf/wmf)
int EGEAPI getimage(PIMAGE pDstImg, LPCWSTR pResType, LPCWSTR pResName, int zoomWidth = 0, int zoomHeight = 0); // 从资源文件获取图像(bmp/jpg/gif/emf/wmf)
void EGEAPI putimage(int dstX, int dstY, PCIMAGE pSrcImg, DWORD dwRop = SRCCOPY); // 绘制图像到屏幕
void EGEAPI putimage(int dstX, int dstY, int dstWidth, int dstHeight, PCIMAGE pSrcImg, int srcX, int srcY, DWORD dwRop = SRCCOPY); // 绘制图像到屏幕(指定宽高)
void EGEAPI putimage(int dstX, int dstY, int dstWidth, int dstHeight, PCIMAGE pSrcImg, int srcX, int srcY, int srcWidth, int srcHeight, DWORD dwRop = SRCCOPY); // 绘制图像到屏幕(指定源宽高和目标宽高进行拉伸)
void EGEAPI putimage(PIMAGE pDstImg, int dstX, int dstY, PCIMAGE pSrcImg, DWORD dwRop = SRCCOPY); // 绘制图像到另一图像中
void EGEAPI putimage(PIMAGE pDstImg, int dstX, int dstY, int dstWidth, int dstHeight, PCIMAGE pSrcImg, int srcX, int srcY, DWORD dwRop = SRCCOPY); // 绘制图像到另一图像中(指定宽高)
void EGEAPI putimage(PIMAGE pDstImg, int dstX, int dstY, int dstWidth, int dstHeight, PCIMAGE pSrcImg, int srcX, int srcY, int srcWidth, int srcHeight, DWORD dwRop = SRCCOPY); // 绘制图像到另一图像中(指定源宽高和目标宽高进行拉伸)
int EGEAPI saveimage(PCIMAGE pimg, LPCSTR filename);
int EGEAPI saveimage(PCIMAGE pimg, LPCWSTR filename);
int EGEAPI savepng(PCIMAGE pimg, LPCSTR filename, int bAlpha = 0);
int EGEAPI savepng(PCIMAGE pimg, LPCWSTR filename, int bAlpha = 0);
int EGEAPI getimage_pngfile(PIMAGE pimg, LPCSTR filename);
int EGEAPI getimage_pngfile(PIMAGE pimg, LPCWSTR filename);
int EGEAPI putimage_transparent(
PIMAGE imgdest, // handle to dest
PCIMAGE imgsrc, // handle to source
int nXOriginDest, // x-coord of destination upper-left corner
int nYOriginDest, // y-coord of destination upper-left corner
color_t crTransparent, // color to make transparent
int nXOriginSrc = 0, // x-coord of source upper-left corner
int nYOriginSrc = 0, // y-coord of source upper-left corner
int nWidthSrc = 0, // width of source rectangle
int nHeightSrc = 0 // height of source rectangle
);
int EGEAPI putimage_alphablend(
PIMAGE imgdest, // handle to dest
PCIMAGE imgsrc, // handle to source
int nXOriginDest, // x-coord of destination upper-left corner
int nYOriginDest, // y-coord of destination upper-left corner
unsigned char alpha, // alpha
int nXOriginSrc = 0, // x-coord of source upper-left corner
int nYOriginSrc = 0, // y-coord of source upper-left corner
int nWidthSrc = 0, // width of source rectangle
int nHeightSrc = 0 // height of source rectangle
);
int EGEAPI putimage_alphatransparent(
PIMAGE imgdest, // handle to dest
PCIMAGE imgsrc, // handle to source
int nXOriginDest, // x-coord of destination upper-left corner
int nYOriginDest, // y-coord of destination upper-left corner
color_t crTransparent, // color to make transparent
unsigned char alpha, // alpha
int nXOriginSrc = 0, // x-coord of source upper-left corner
int nYOriginSrc = 0, // y-coord of source upper-left corner
int nWidthSrc = 0, // width of source rectangle
int nHeightSrc = 0 // height of source rectangle
);
int EGEAPI putimage_withalpha(
PIMAGE imgdest, // handle to dest
PCIMAGE imgsrc, // handle to source
int nXOriginDest, // x-coord of destination upper-left corner
int nYOriginDest, // y-coord of destination upper-left corner
int nXOriginSrc = 0, // x-coord of source upper-left corner
int nYOriginSrc = 0, // y-coord of source upper-left corner
int nWidthSrc = 0, // width of source rectangle
int nHeightSrc = 0 // height of source rectangle
);
int EGEAPI putimage_withalpha(
PIMAGE imgdest, // handle to dest
PCIMAGE imgsrc, // handle to source
int nXOriginDest, // x-coord of destination upper-left corner
int nYOriginDest, // y-coord of destination upper-left corner
int nWidthDest, // width of destination rectangle
int nHeightDest, // height of destination rectangle
int nXOriginSrc, // x-coord of source upper-left corner
int nYOriginSrc, // y-coord of source upper-left corner
int nWidthSrc, // width of source rectangle
int nHeightSrc // height of source rectangle
);
int EGEAPI putimage_alphafilter(
PIMAGE imgdest, // handle to dest
PCIMAGE imgsrc, // handle to source
int nXOriginDest, // x-coord of destination upper-left corner
int nYOriginDest, // y-coord of destination upper-left corner
PCIMAGE imgalpha, // alpha
int nXOriginSrc, // x-coord of source upper-left corner
int nYOriginSrc, // y-coord of source upper-left corner
int nWidthSrc, // width of source rectangle
int nHeightSrc // height of source rectangle
);
int EGEAPI imagefilter_blurring (
PIMAGE imgdest, // handle to dest
int intensity,
int alpha,
int nXOriginDest = 0,
int nYOriginDest = 0,
int nWidthDest = 0,
int nHeightDest = 0
);
int EGEAPI putimage_rotate(
PIMAGE imgdest,
PCIMAGE imgtexture,
int nXOriginDest,
int nYOriginDest,
float centerx,
float centery,
float radian,
int btransparent = 0, // transparent (1) or not (0)
int alpha = -1, // in range[0, 256], alpha== -1 means no alpha
int smooth = 0
);
int EGEAPI putimage_rotatezoom(
PIMAGE imgdest,
PCIMAGE imgtexture,
int nXOriginDest,
int nYOriginDest,
float centerx,
float centery,
float radian,
float zoom,
int btransparent = 0, // transparent (1) or not (0)
int alpha = -1, // in range[0, 256], alpha== -1 means no alpha
int smooth = 0
);
int EGEAPI putimage_rotatetransparent(
PIMAGE imgdest,/* handle to dest, NULL means the SCREEN */
PCIMAGE imgsrc,/* handle to source */
int xCenterDest,/* x-coord of rotation center in dest */
int yCenterDest,/* y-coord of rotation center in dest */
int xCenterSrc, /* x-coord of rotation center in source */
int yCenterSrc,/* y-coord of rotation center in source */
color_t crTransparent, /* color to make transparent */
float radian, /* rotation angle (clockwise, in radian) */
float zoom=1.0 /* zoom factor */
);
int EGEAPI putimage_rotatetransparent(
PIMAGE imgdest,/* handle to dest, NULL means the SCREEN */
PCIMAGE imgsrc,/* handle to source */
int xCenterDest,/* x-coord of rotation center in dest */
int yCenterDest,/* y-coord of rotation center in dest */
int xOriginSrc, /* x-coord of source upper-left corner */
int yOriginSrc, /* y-coord of source upper-left corner */
int widthSrc, /* width of source rectangle */
int heightSrc, /* height of source rectangle */
int xCenterSrc, /* x-coord of rotation center in source */
int yCenterSrc,/* y-coord of rotation center in source */
color_t crTransparent, /* color to make transparent */
float radian, /* rotation angle (clockwise, in radian) */
float zoom=1.0 /* zoom factor */
);
五、总结
今天,我们学习了有关图像操作的函数,那么我们下次继续!
上期: DEV-C++ ege.h库 绘图教程(四)
下期: DEV-C++ ege.h库 绘图教程(六)