2008年11月5日

双线性内插值法简单实现

图像缩放有几种常见的算法:最邻近插值(近邻取样法)、双线性内插值和三次卷积法,从得到的图像质量来说分别从低到高,从耗费的时间来看是从少到多。

Windows系统的函数StretchDIBits采用的是最邻近插值法,其运算速度最快,不过得到的图像质量也是惨不忍睹,下面是个对比:

frame_3.jpg2.JPG

原始图片为手机拍摄,size为320X240,右边是用windows自带的StretchDIBits放大两倍的结果,左边是采用双线性内插值法缩放的结果,注意观察图像中有斜线条的地方,最邻近插值法明显看到大量锯齿,而双线性内插值法则有效的消除了这些锯齿的产生。下面是转换函数代码,src为输入RGB数据(24位色),width和height为原始宽高,dest为输出的2倍大小的RGB数据。

void resize_rgbbuf(unsigned char * dest,unsigned char * src,int width,int height)
{
int sw = width - 1, sh = height - 1, dw = width*2 - 1, dh = height*2 - 1;

int B, N, x, y;
int nPixelSize = 3; // 24 color,3 bytes each pixel
BYTE * pLinePrev, *pLineNext;
BYTE * pDest;
BYTE * pA, *pB, *pC, *pD;


for ( int i = 0; i <= dh; ++i )
{
pDest = ( BYTE * )dest+i*width*2*3;
y = i * sh / dh;
N = dh - i * sh % dh;

pLinePrev = ( BYTE * )src+y*width*3;
y++;
pLineNext = ( N == dh ) ? pLinePrev : ( BYTE * )src+y*width*3;

for ( int j = 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 ( int k = 0; k < nPixelSize; ++k )
*pDest++ = ( BYTE )( 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 )
);
}
}
return;

}


Full Text

2008年10月26日

西博会开了,我们堵了

今天是伟大的西博会开幕的日子,人民南路被封,而且事前没有任何通知,所有车辆被迫绕行。。。。。今天我上班晚了刚好30分钟,而且路上目睹了5起车祸,so powerful


Full Text

2008年10月21日

Finacial picture(wave picture from 1900 to 2008)

Dow-Cht-Flt-Str-021508-1150.gif


Full Text

I feel alone

I feel alone recent days,something happenned,something changed,maybe I changed also


Full Text

2008年10月19日

SVN服务器镜像简单设置(svnsync)

架设了svn版本服务器之后,为了保险起见通常需要对数据进行备份,使用svnsync进行版本镜像就是一种方式,也是我们采取的方式。

应用环境:本机有项目admin_project需要进行镜像,镜像目的地定为本机的项目admin_back(简单点好测试,实际应用时没有区别)

步骤:

1. 初始化。首先在本机建立项目admin_back,创建reposity,在conf目录中设置好权限并和密码。然后再hooks目录中建立一个文件pre-revprop-change.bat(Windows系统下为bat文件,Unix环境下不需要bat后缀,设置文件执行权限即可)。做完前面的工作后,执行svnsync进行初始化操作:

svnsync init svn://127.0.0.1/admin_back svn://127.0.0.1/admin_project

镜像目的地admin_back在前,镜像源admin_project在后。按照提示输入帐号密码,初始化工作就ok了。

2.进行同步操作,建立镜像。第一步只做了必要的初始化工作,将镜像项目和源项目关联到一起,但并没有做实际的文件同步操作,这步才会有实际的文件同步操作。执行命令:

svnsync sync svn://127.0.0.1/admin_back

前面已经将镜像目的和源进行了关联,所以这步命令中只需要指定镜像的目的即可。这步操作完成之后你就在admin_back 项目中有了项目admin_project的镜像。以后每次需要同步时执行这步的命令即可。

3.钩子自动同步(还未测试)。如果希望在每次提交时自动同步,则需要在原版本库增加post-commit脚本,内容如下:

echo off
svnsync sync --non-interactivesvn://127.0.0.1/admin_back

将上面的的内容存放为post-commit.bat(for win),然后放在源版本库项目admin_project下的hooks目录下,这样每次源版本库提交,都会引起镜像项目admin_back的同步


Full Text