1、用Win32 API:
SetWorldTransform是API带的,可以旋转,缩放
2、用OpenGL
用OpengGL也可以通过移动视点来实现,glTranslate3f
3、自己做,就是什么九点采样、中值滤波之类的算法,你得好好看看计算机图形学
SetWorldTransform是API带的,可以旋转,缩放
2、用OpenGL
用OpengGL也可以通过移动视点来实现,glTranslate3f
3、自己做,就是什么九点采样、中值滤波之类的算法,你得好好看看计算机图形学
调试欢乐多
2 --> 3
000 111
-> 000 000 000 111 111 111
-> (000+000)/2 (000+111)/2 (111+111)/2
想法很简单很笨,当然效果也是最理想,但是不现实的:
我实现了该算法,一幅640*480的24位真彩图放大成800*600要用28s(在我的duron 700)!!
小图还可以接受,200*200图用1s左右。
我所写的算法几乎已经是在不内嵌asm的情况下非常优化的了(在循环中除了最后的除法外全部用加法和指针运算)
因此好的算法要胜过任何优化,“人脑是最好的优化器”,car如是说。
我已经想到一个更好的算法了,呵呵~~。
这个是在16位色下工作的。
/*src pointer to memory containe bitmap data */
/*src_w width of src line */
/*dest_w width of dest line */ void* ScaleLine(void* src,int src_w,int dest_w)/*scale one line of pixel */
{
int scalerate=(100*dest_w)/src_w;
int ds=0;
char* dest;
char* srce=src;
dest=new char[dest_w<<1];
for(int i=0;i<dest_w;i++)
{
dest[i<<1]=srce[ds/100<<1];
dest[(i<<1)+1]=srce[(ds/100<<1)+1];
ds+=scalerate;
}
return dest;
}
/* scale a given sets of line */
/* src_l lines of src */
/* dest_l lines of dest */
void **Scale(void** src,int* src_w,int* dest_w,int src_l,int dest_l)
{
void** dest=new (void*)[dest_l];
int ds=0;
int scalerate=(100*dest_l)/src_l;
for(int i=0;i<dest_l;i++)
{
dest[i]=ScaleLine(src[ds/100],src_w[ds/100],dest_w[ds/100]);
ds+=scalerate;
}
return dest;
}
不带过滤的,没有优化
跟你说一下思路:
目标图上每个点都用原图上的相邻四点运算得出。
简单起见,先说一维的情况(也不考虑颜色,每个字节一个像素):
下面是对一行进行放缩的伪代码。
int i = 0, si = 0; // i: 目标图增量,si: 原图增量
int inc = 0; // inc: 比例系数
for (i = 0; i < dw; i++) { // dw是目标图宽
pDest[i] = pSrc[si]*(1-inc/(float)dw)+pSrc[si+1]*(inc/(float)dw);
inc += sw; // sw是原图宽
while (inc >= dw) {
inc -= dw;
si++;
}
}算法我已经实现,640*480 -> 800*600 < 0.5s(包括图片载入时间:)