单击打开链接(2011-10-09 19:12:51 )转载标签: it分类:多媒体(图形图像/音视频)//Resize CImage
voidcreatestretchimage (cimage * pimage、CImage *ResultImage、int StretchHeight、int StretchWidth ) {
if(pimage-isdibsection () ) )
获取pImage的直流
CDC * pimage DC1=CDC :3360 from handle (pimage-getdc (); //Image有自己的直流,必须使用FromHandle获取相应的直流
cbitmap * bitmap1=pimage DC1- getcurrentbitmap (;
位图BMP info;
位图1 -千兆位图(BMP info );
//创建新的CImage
结果图像-创建(stretch width,StretchHeight,bmpInfo.bmBitsPixel );
CDC * resultimagedc=CDC :3360 from handle (result image-getdc );
如果目标小时,则根据目标直流的拉伸蓝牙BLT模式,决定是否保持被删除的点的信息
resultimagedc-setstretchbltmode; //使用最高质量的方式
:3360 setbrushorgex (resultimagedc-m _ hdc,0,0,NULL ); 调整浏览的起点
将pImage绘制在结果图像上
stretchblt(*resultimagedc,0,0,StretchWidth,StretchHeight,* pimage DC 1,0,0,pImage-GetWidth ),pimage-getwid
//pimage-draw(*resultimagedc,0,0,StretchWidth,StretchHeight,0,0,pImage-GetHeight ),pImage-GetHeight
pImage-ReleaseDC (;
结果图像- releasedc (;
}
}
//创建指定大小的图形
如果输入:元的图形文件=pBitmap并指定大小=StretchHeight StretchWidth,则生成的图形文件=pResultBmp
//Usage:
voidreatestretchbmp (cbitmap * pbitmap,int StretchHeight,int StretchWidth,CBitmap *pResultBmp ) }
//制作显示监视器的直流
CDC直流屏幕;
DC screen.attach (:3360 getdc (null );
//获取原始图形文件的直流
CDC直流内存;
DC内存. createcompatibledc (DC屏幕;
cbitmap * poldorgbitmap=DC memory.select object (pbitmap );
//创建新的结果图表(指定大小)
presult BMP-createcompatiblebitmap (DC screen,StretchWidth,StretchHeight );
//获取结果图表的直流
CDC dcFixMemory;
cfixmemory.createcompatibledc (DC屏幕;
cbitmap * poldreslutbitmap=dcfixmemory.select object (presult BMP ); 如果选择//dcFixMemory中的“结果bmp”,则dcfixmemory的所有操作都将反映在pResultBmp中
//将原始图形缩放到内存直流上绘制
位图BMP info;
位图-千兆位图(BMP info; //获取原始图形文件的宽度和高度
stretchblt(dcfixmemory,0,0,StretchWidth,StretchHeight,dcMemory,0,0,bmpInfo.bmWidth,bmpInfo.bmHeight,
//Set Back
DC memory.select object (poldorgbitmap;
dfixmemory.select object (poldreslutbitmap;
}
那位朋友使用过画行缩放的插值算法。 我本来的做法是把整个图像的内容读入内存,用插值算法进行缩放。 但是,我现在需要内存优化,所以源数据需要一行一行地读。 我的想法是读一行数据,用插值算法转换一次,但是插值算法需要参考周围四点的数据进行插值,所以我不确定我现在的想法是否可行。 有谁做过这个工作吗?
放大或缩小整个图像的代码如下。
unsigned char * HCN image :3360 do _ stretch _ linear (intw _ dest,int h_Dest,int bit_depth,unsigned char *src
{
int sw=w_Src-1,sh=h_Src-1,dw=w_Dest-1,dh=h_Dest-1;
int B,n,x,y;
int nPixelSize=bit_depth/8;
无符号char * pline prev,*pLineNext;
统一char * pdest=newunsignedchar [ w _ dest * h _ dest * bit _ depth/8 ];
无符号char * tmp;
无符号char * pa、*pB、*pC、*pD;
for(intI=0; i=dh; I )
{
tmp=pDest i*w_Dest*nPixelSize;
y=i*sh/dh;
N=dh - i*sh%dh;
plineprev=src(y ) *w_Src*nPixelSize;
plinenext=(n==DH )? pline prev : srcy * w _ src * npixelsize;
for(intj=0; j=dw; j )
{
x=j*sw/dw*nPixelSize;
B=dw-j*sw%dw;
pA=pLinePrev x;
pB=pA nPixelSize;
pC=pLineNext x;
pD=pC nPixelSize;
if(b==dw ) )。
{
pB=pA;
pD=pC;
}
for(intk=0; knPixelSize; k )
{
* tmp=(未指定的char ) (int ) (
(b*n* ) ) pa-*Pb-*PC*PD ) dw * N * *pB
DH*B**PC(dw*DH-DH*B-dw*n ) * *pD
dw*DH/2(/) dw*DH );
}
}
}
返回深度;
}