#include "stdafx.h"
#include <math.h>
#include <io.h>
#include <direct.h>
#include "dibapi.h"
#include <complex>
#define DIB_HEADER_MARKER ((WORD) ('M' << 8) | 'B')
/////////////////////////////////////////////////////////////////////////////////////
// DXF.2003.10.20
// myfile2.cpp
//
// HGLOBAL WINAPI ZoomPixelreplication(HDIB hDib,unsigned char ** PixelData,
// float hzoom,float vzoom)
// 利用像素复制放大缩小图像
// HGLOBAL WINAPI ZoomBilinear(HDIB hDib,unsigned char ** PixelData,
// float hzoom,float vzoom)
// 双线形插值放大缩小图像
// BOOL WINAPI GrayReduce(HDIB hDib,unsigned char ** PixelData,long GrayLevel)
// 图像gray的衰减
// BOOL WINAPI Reverse(HDIB hDib,unsigned char ** PixelData)
// 灰度图像的反色处理
// BOOL WINAPI TransHalftone(HDIB hDib,unsigned char ** PixelData)
// 图像的halftone处理
// BOOL WINAPI ArithmeticOpr (HDIB hDib,unsigned char ** PixelData,
// unsigned char ** PixelData2,const CString Opr,
// const int width,const int height,const double scale,const double factor)
// 图像的算数处理
// BOOL WINAPI TransBw(HDIB hDib,unsigned char ** PixelData);
// 生成黑白图
/////////////////////////////////////////////////////////////////////////////////////
/*///////////////////////////////////////////////////////////////////////////
// HGLOBAL WINAPI ZoomPixelreplication(HDIB hDib,unsigned char ** PixelData,
// float hzoom,float vzoom)
// 利用像素复制放大缩小图像
* 参数:
* HDIB hDib - 指向源DIB图像句柄
* unsigned char ** PixelData 像素数组
* float hzoom 水平缩放率
* float vzoom 垂直缩放率
* 返回值:
* HGLOBALL - 运算成功返回缩放后的图像句柄,否则返回NULL。
//////////////////////////////////////////////////////////////////////////*/
HGLOBAL WINAPI ZoomPixelreplication(HDIB hDib,unsigned char ** PixelData,float hzoom,float vzoom)
{
LPBITMAPINFOHEADER lpBi;
lpBi=(LPBITMAPINFOHEADER)::GlobalLock((HGLOBAL) hDib);
// 缩放后新DIB句柄
HDIB hNewDIB;
// 缩放后图像的宽度和高度
LONG lNewWidth=0,lNewHeight=0, lrgb,lNewLineBytes,ltruebit;
// 指向缩放图像的指针
LPSTR lpNewDIB;
unsigned char * hNewData;
LPBITMAPINFOHEADER lpbmi;
// 循环变量(象素在新DIB中的坐标)
LONG i,j,i0,j0,len;
AfxGetApp()->BeginWaitCursor();
// 计算缩放后的图像实际宽度
lNewWidth = (LONG) (lpBi->biWidth*hzoom);
if (8==lpBi->biBitCount) len=1;
if (24==lpBi->biBitCount) len=3;
// 计算新图像每行的字节数
lNewLineBytes = WIDTHBYTES(lNewWidth * 8 * len);
// 计算缩放后的图像高度
lNewHeight = (LONG) (lpBi->biHeight*vzoom);
// 分配内存,以保存新DIB
hNewDIB = (HDIB) ::GlobalAlloc(GHND, lNewLineBytes * lNewHeight + *(LPDWORD)(lpBi) +\
::PaletteSize((LPSTR)lpBi));
// 判断是否内存分配失败
if (hNewDIB == NULL)// 分配内存失败
return NULL;
// 锁定内存
lpNewDIB = (char * )::GlobalLock((HGLOBAL) hNewDIB);
// 复制DIB信息头和调色板
memcpy(lpNewDIB, (LPSTR)lpBi, *(LPDWORD)(lpBi) + ::PaletteSize((LPSTR)lpBi));
// 找到新DIB象素起始位置
hNewData = (unsigned char*)::FindDIBBits(lpNewDIB);
// 获取指针
lpbmi = (LPBITMAPINFOHEADER)lpNewDIB;
// 更新DIB中图像的高度和宽度
lpbmi->biWidth = lNewWidth;
lpbmi->biHeight = lNewHeight;
for (lrgb=0;lrgb<len;lrgb++)
// 针对图像每行进行操作
for(i = 0; i < lNewHeight; i++)
{
// 针对图像每列进行操作
for(j = 0; j < lNewWidth; j++)
{
i0 = (LONG) (i / vzoom );
j0 = (LONG) (j / hzoom );
ltruebit=j0*len+lrgb;
// 判断是否在源图范围内
if( (j0 >= 0) && (j0 < lpBi->biWidth) && (i0 >= 0) && (i0 < lpBi->biHeight))
{
// 为像素赋值
*(hNewData+lNewLineBytes* i + j*len+lrgb) = PixelData[i0][ltruebit];
}
else
{ // 对于源图中没有的像素,直接赋值为255
*(hNewData+lNewLineBytes* i + j*len+lrgb) = 255;
}
}
}
AfxGetApp()->EndWaitCursor();
::GlobalUnlock((HGLOBAL)hDib);
// 返回
return hNewDIB;
}
/*///////////////////////////////////////////////////////////////////////////
// HGLOBAL WINAPI ZoomBilinear(HDIB hDib,unsigned char ** PixelData,
// float hzoom,float vzoom)
// 双线形插值放大缩小图像
* 参数:
* HDIB hDib - 指向源DIB图像句柄
* unsigned char ** PixelData 像素数组
* float hzoom 水平缩放率
* float vzoom 垂直缩放率
* 返回值:
* HGLOBALL - 运算成功返回缩放后的图像句柄,否则返回NULL。
//////////////////////////////////////////////////////////////////////////*/
HGLOBAL WINAPI ZoomBilinear(HDIB hDib,unsigned char ** PixelData,float hzoom,float vzoom){
LPBITMAPINFOHEADER lpBi;
lpBi=(LPBITMAPINFOHEADER)::GlobalLock((HGLOBAL) hDib);
// 缩放后新DIB句柄
HDIB hNewDIB;
// 缩放后图像的宽度和高度
LONG lNewWidth=0,lNewHeight=0, lNewLineBytes;
// 缩放后图像的宽度(lNewWidth',必须是4的倍数)
// 指向缩放图像的指针
LPSTR lpNewDIB;
unsigned char * hNewData;
// 指向BITMAPINFO结构的指针(Win3.0)
LPBITMAPINFOHEADER lpbmi;
// 循环变量(象素在新DIB中的坐标)
LONG i,j,i0,j0,l1,l2,i2,j2;
float i1,j1;
AfxGetApp()->BeginWaitCursor();
// 计算缩放后的图像实际宽度
lNewWidth = (LONG) (lpBi->biWidth*hzoom);
// 计算新图像每行的字节数
lNewLineBytes = WIDTHBYTES(lNewWidth * 8);
// 计算缩放后的图像高度
lNewHeight = (LONG) (lpBi->biHeight*vzoom);
// 分配内存,以保存新DIB
hNewDIB = (HDIB) ::GlobalAlloc(GHND, lNewLineBytes * lNewHeight + *(LPDWORD)(lpBi) +\
::PaletteSize((LPSTR)lpBi));
// 判断是否内存分配失败
if (hNewDIB == NULL)// 分配内存失败
return NULL;
// 锁定内存
lpNewDIB = (char * )::GlobalLock((HGLOBAL) hNewDIB);
// 复制DIB信息头和调色板
memcpy(lpNewDIB, (LPSTR)lpBi, *(LPDWORD)(lpBi) + ::PaletteSize((LPSTR)lpBi));
// 找到新DIB象素起始位置
hNewData = (unsigned char*)::FindDIBBits(lpNewDIB);
// 获取指针
lpbmi = (LPBITMAPINFOHEADER)lpNewDIB;
// 更新DIB中图像的高度和宽度
lpbmi->biWidth = lNewWidth;
lpbmi->biHeight = lNewHeight;
//已知a,b,c,d四点的灰度,要求e点的灰度,
//可以先在水平方向上由a,b线形插值求出g,c,d线形插值求出f,
//然后在垂直方向上由g,f线形插值求出e 线形插值是基于这样的假设,
//即原图的灰度在两个像素之间是线形变化的,一般情况下,
//这种插值的效果还不错。更精确的方法是采用曲线插值(Curvilinear Interpolation),
//即认为像素之间的灰度变化规律符合某种曲线,但这种处理的计算量是很大的。
// 针对图像每行进行操作
for(i = 0; i < lNewHeight; i++)
{
// 针对图像每列进行操作
for(j = 0; j < lNewWidth; j++)
{
i0 = (LONG) (i / vzoom );
j0 = (LONG) (j / hzoom );
i1 = i / vzoom ;
j1 = j / hzoom ;
// 判断是否在源图范围内
if ((i0==i1)&&(j0==j1))
*(hNewData+lNewLineBytes* i + j) = PixelData[i0][j0];
else
{
i2 = (LONG) (i / vzoom +0.5);
j2 = (LONG) (j / hzoom +0.5);
if (i2==lpBi->biHeight) i2=lpBi->biHeight-1;
if (j2==lpBi->biWidth) j2=lpBi->biWidth-1;
//f(x1)=(f(x2)-f(x0))*(x1-x0)/(x2-x0)+f(x0);
l1 = (PixelData[i0][j2]-PixelData[i0][j0])*(j1-j0)/(j2-j0)+PixelData[i0][j0];
l2 = (PixelData[i2][j2]-PixelData[i2][j0])*(j1-j0)/(j2-j0)+PixelData[i2][j0];
if ( (i2!=i0) && (j0!=j2) )
l1 = (l2-l1)*(i1-i0)/(i2-i0)+l1;
else
l1=PixelData[i0][j0];
*(hNewData+lNewLineBytes* i + j) = l1;
}
}
}
::GlobalUnlock((HGLOBAL)hDib);
AfxGetApp()->EndWaitCursor();
// 返回
return hNewDIB;
}
//////////////////////////////////////////////////////////////////////
//limb算法,生成二维数组
////////////////////////////////////////////////////////////////////
BYTE **limb(int Level)
{
int i,j, i0,i1;
BYTE ** gray;
BYTE ** graytmp;
i0 = pow(2,Level);
gray = new BYTE*[i0];
//初始化数组
for (i=0;i<i0;i++)
gray[i] = new BYTE[i0];
//BYTE gr
myfile2.rar_zoom_图 放大_图像 缩小_插值_放大缩小
版权申诉
156 浏览量
2022-09-22
16:49:34
上传
评论
收藏 5KB RAR 举报
APei
- 粉丝: 63
- 资源: 1万+
最新资源
- 80632180.jpg
- 李旭国体注入追踪[5.0](1).zip
- semantic.c
- C语言基础-C语言编程基础之Leetcode编程题解之第39题组合总和.zip
- C语言基础-C语言编程基础之Leetcode编程题解之第38题外观数列.zip
- C语言基础-C语言编程基础之Leetcode编程题解之第37题解数独.zip
- C语言基础-C语言编程基础之Leetcode编程题解之第36题有效的数独.zip
- C语言基础-C语言编程基础之Leetcode编程题解之第35题搜索插入位置.zip
- index.wxml
- C语言基础-C语言编程基础之Leetcode编程题解之第33题搜索旋转排序数组.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0