/**********************************************************
dibcore.cpp WannaPlayDIB实用图形库 类、接口和核心API实现
版权所有(C) 2001 WannaPlay
WannaPlayDIB实用图形函数库完全自由发放。
任何人都可以没有限制的使用、修改和再发布本代码。
同时作者也没有义务为代码可能对你的应用和系统造
成的任何损害承担责任。
发现任何Bug,缺陷,或有任何意见和建议,请联系作者。
谢谢。
Home Page: http://wannaplay.51.net
eMail: [email protected]
OICQ: 17219193
***********************************************************/
#include "stdafx.h"
#include <math.h>
#include <stdlib.h>
#include <memory.h>
#include "dibcore.h"
#define PI 3.1415926535897932384626
//////////////////////////////////////////////////////////////////////
// WannaPlayDIB库内部全局变量定义
//////////////////////////////////////////////////////////////////////
// 库函数的当前透明色。
// 也就是说,对这个颜色的设置将影响到所有使用透明色的函数。
// 这些函数包括DIB_GetColorKey, DIB_Blt, DIB_BltFast,
// DIB_CreateRegion, DIB_ClearColorRange, DIB_Rotate,
// DIB_RotateFast等
// 默认透明色为黑色
DIB_COLOR g_colorKey = COLOR_BLACK;
//////////////////////////////////////////////////////////////////////
// CDib类的成员函数实现
//////////////////////////////////////////////////////////////////////
/**
* 创建指定大小的单色图像。
* @param w 宽度
* @param h 高度
* @param colorInit 初始化颜色
* 注意,如果你只是想创建一块用来绘图的数据缓冲,
* 那么请用黑色作为参数,效率将更高。
*/
CDib::CDib(int w, int h, DIB_COLOR colorInit) {
m_nWidth = w;
m_nHeight = h;
m_nPitch = DIB_WIDTH2PITCH(w);
int size = h*m_nPitch;
m_pBits = new BYTE[size]; // 分配图像数据内存
memset(m_pBits, 0, size); // 把这块得到的内存清0
if (colorInit == COLOR_BLACK) {
return; // 因为黑色实际就是全0,所以这里就可以快速返回了
}
// 下面将用一个二重循环访问每一个像素,并用指定的颜色赋值
int i = 0, j = 0; // 循环计数器
// 垂直方向的增量指针。每操作完一行数据,它就被指向下一个扫描行
BYTE *pVInc = m_pBits; // 初始化为第一个扫描行的首地址(也就是整个图像数据的首址)
// 水平方向的增量指针。每操作完一个像素,它就被指向下一个像素
BYTE *pHInc = NULL; // 它将在每次对一个扫描行开始处理之前被赋值
for (i = 0; i < h; i++) {
pHInc = pVInc; // 把水平增量指针初始化为当前扫描行的首址
for (j = 0; j < w; j++) {
dib_SetColor(pHInc, colorInit);
pHInc += PIXELSIZE; // 一个像素数据赋值完成,指针指向下一个
}
pVInc += m_nPitch; // 一个扫描行处理完,指针指向下一行
}
}
/**
* 把给定的CDib对象“克隆”一份,包括图像数据。
* @param refDib 被clone对象的引用
*/
CDib::CDib(CDib &refDib) {
m_nWidth = refDib.m_nWidth;
m_nHeight = refDib.m_nHeight;
m_nPitch = DIB_WIDTH2PITCH(m_nWidth);
int size = m_nHeight * m_nPitch;
m_pBits = new BYTE[size];
memcpy(m_pBits, refDib.m_pBits, size);
}
/**
* 析构函数。
* 把为这个CDib对象的图像数据分配的内存释放掉。
*/
CDib::~CDib() {
if (m_pBits != NULL) {
delete[] m_pBits;
}
}
/**
* 重载等号运算符。
* 这样你可以像对一个一般变量一样直接对一个CDib赋值。
* 和上面的第二个构造函数一样,
* 把给定的CDib对象“克隆”一份,包括图像数据。
* @param refDib 被clone对象的引用
*/
CDib CDib::operator =(CDib &refDib) {
if (this == &refDib) {
return *this;
}
if (m_pBits != NULL) {
delete[] m_pBits;
}
m_nWidth = refDib.m_nWidth;
m_nHeight = refDib.m_nHeight;
m_nPitch = DIB_WIDTH2PITCH(m_nWidth);
int size = m_nHeight * m_nPitch;
m_pBits = new BYTE[size];
memcpy(m_pBits, refDib.m_pBits, size);
return *this;
}
/**
* 用给定的IImageWrapper对象载入一张图像
*/
CDib* DIB_LoadImage(IImageWrapper *loader) {
return loader->LoadDib();
}
/**
* 用给定的IImageWrapper对象把Dib对象保存为图像文件
*/
void DIB_SaveImage(CDib *pDib, IImageWrapper *writer) {
writer->SaveDib(pDib);
}
/**
* 为了实现你所希望的滤波效果,你可以自己编写一个DIB_FILTERPROC型的函数,
* 并把它作为参数调用DIB_Filter,这个函数将对每一个像素调用你的函数,
* 并传给它足够的信息去处理图像数据。
* @param pDib 待过滤的图像数据
* @param filterProc 提供过滤操作的回调函数
* @param filterParam 自定义参数,DIB_Filter直接把这个参数传递给filterProc。
* 下面给出一个超简单的例子,用来把给定CDib对象清成黑色,
* 你一定可以举一反三,编出更强大的过滤器。请充分利用DIB_Filter传给过滤函数的参数!
*
* void CALLBACK ClearFilterProc(CDib *pDib, int x, int y, BYTE *pixel, void *pUnused) {
* dib_SetColor(pixel, COLOR_BLACK);
* }
*
*/
void DIB_Filter(CDib *pDib, DIB_FILTERPROC filterProc, void *filterParam) {
// 用一个二重循环访问每一个像素并用给定的过滤函数过滤之
int i = 0, j = 0; // 循环计数器
// 垂直方向的增量指针。每操作完一行数据,它就被指向下一个扫描行
BYTE *pVInc = pDib->m_pBits; // 初始化为第一个扫描行的首地址(也就是整个图像数据的首址)
// 水平方向的增量指针。每操作完一个像素,它就被指向下一个像素
BYTE *pHInc = NULL; // 它将在每次对一个扫描行开始处理之前被赋值
for (i = 0; i < pDib->m_nHeight; i++) {
pHInc = pVInc; // 把水平增量指针初始化为当前扫描行的首址
for (j = 0; j < pDib->m_nWidth; j++) {
filterProc(pDib, j, i, pHInc, filterParam); // 过滤当前像素
pHInc += PIXELSIZE; // 一个像素数据过滤完成,指针指向下一个
}
pVInc += pDib->m_nPitch; // 一个扫描行处理完,指针指向下一行
}
}
/**
* 为了实现你更复杂的滤波效果,或者你需要对过滤器进行一定的定制,
* 那么你可以选择编写一个类,它必须实现IAbstractFilter接口。
* 也就是说,必须实例化Filter函数。
* 把这个类的对象作为参数调用DIB_Filter,该函数将对每一个像素
* 调用这个对象的Filter成员函数,并传给它足够的信息去处理图像数据。
* @param pDib 待过滤的图像数据
* @param filter 提供过滤操作的IAbstractFilter子类
*/
void DIB_Filter(CDib *pDib, IAbstractFilter *filter) {
// 用一个二重循环访问每一个像素并过滤之
int i = 0, j = 0; // 循环计数器
// 垂直方向的增量指针。每操作完一行数据,它就被指向下一个扫描行
BYTE *pVInc = pDib->m_pBits; // 初始化为第一个扫描行的首地址(也就是整个图像数据的首址)
// 水平方向的增量指针。每操作完一个像素,它就被指向下一个像素
BYTE *pHInc = NULL; // 它将在每次对一个扫描行开始处理之前被赋值
for (i = 0; i < pDib->m_nHeight; i++) {
pHInc = pVInc; // 把水平增量指针初始化为当前扫描行的首址
for (j = 0; j < pDib->m_nWidth; j++) {
filter->Filter(pDib, j, i, pHInc); // 过滤当前像素
pHInc += PIXELSIZE; // 一个像素数据过滤完成,指针指向下一个
}
pVInc += pDib->m_nPitch; // 一个扫描行处理完,指针指向下一行
}
}
/**
* DIB_FilterRect与前面的DIB_Filter类似,不过这个函数只对给定RECT当中的
* 每一个像素调用指定的函数,并传给它足够的信息去处理图像数据。
* 注意,超出pDib边界范围的RECT将被裁剪掉。
* @param pDib 待过滤的图像数据
* @param filterProc 提供过滤操作的回调函数
* @param filterParam 自定义参数,DIB_Filter直接把这个参数传递给filterProc。
* @param pRect 待过滤的矩形
*/
void DIB_FilterRect(CDib *pDib, DIB_FILTERPROC filterProc, void *filterParam, LPRECT pRect) {
// 用一个二重循环访问矩形的每一个像素并用给定的过滤函数过滤之
int i = 0, j = 0; // 循环计数器
int left = pRect->left < 0 ? 0 : pRect->left;
int right = pRect->right > pDib->m_nWidth ? pDib->m_nWidth : pRect->right;
int top = pRect->top < 0 ? 0 : pRect->top;
int bottom = pRect->bottom > pDib->m_nHeight ? pDib->m_nHeight : pRect->bottom;
int w = right - left;
int h = bottom - top;
// 垂直方向的增量指针。每操作完RECT中的一行数据,它就被指向RECT中的下一行的起始
BYTE *pVInc = pDib->m_pBits+top*pDib->m_nPitch+left+left+left; // 初始化为RECT中第一行的首地址
没有合适的资源?快使用搜索试试~ 我知道了~
商业编程-源码-WannaPlayDIB实用图形库源代码.zip
共19个文件
h:7个
cpp:5个
ico:2个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 20 浏览量
2022-06-22
12:44:19
上传
评论
收藏 91KB ZIP 举报
温馨提示
商业编程-源码-WannaPlayDIB实用图形库源代码.zip
资源推荐
资源详情
资源评论
收起资源包目录
商业编程-源码-WannaPlayDIB实用图形库源代码.zip (19个子文件)
WannaPlayDIB实用图形库源代码
dibstruct.h 3KB
blt.dsp 5KB
title.bmp 177KB
blt.dsw 531B
StdAfx.cpp 290B
resource.h 1KB
blt.h 317B
blt.cpp 5KB
dibbmp.h 937B
dibbmp.cpp 4KB
Enemy11.bmp 20KB
small.ico 318B
blt.rc 3KB
StdAfx.h 957B
dibwin.h 1KB
dibcore.cpp 27KB
dibwin.cpp 11KB
dibcore.h 8KB
blt.ico 1KB
共 19 条
- 1
资源评论
programxh
- 粉丝: 17
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 前端-html+css+js实现爱心特效
- c40539bc-071a-486c-9d52-9d0c18d62dac 4.html
- 基于物理的非视域成像(NLOS)算法,利用了nerf+python源码+文档说明
- yuluer知更鸟.7z(1).001
- 基于Qt实现医院信息管理系统c++源码+文档说明+数据库(期末大作业)
- 基于python实现的医院信息管理系统完整源码+sql数据库+详细注释(高分课程设计)
- 基于python的眼底图像视杯视盘分割项目源码+文档说明+截图演示+详细注释(高分课程设计)
- ImageBasedModellingEdu-贰壹贰叁零
- DFFmeasurement-数据预处理
- ImageBasedModellingEdu-回文素数c语言
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功