位图旋转
将位图( DIB,单色,宽=高)旋转90度,我采用逐个计算新位图的像素点的方法
但太慢,旋转一个800 X 800 的位图用了一二十秒,相信有更好的办法
问题点数:50、回复次数:7Top
1 楼shh03(半山腰)回复于 2002-10-10 20:50:10 得分 0
高手大哥帮帮忙吧Top
2 楼aawolf(羌狼)回复于 2002-10-10 21:11:25 得分 20
TBitmap里不是有个旋转的方法吗?Top
3 楼sjd163(sjd163)回复于 2002-10-10 21:24:39 得分 5
用坐标变换:(i,j)->(x,y)
x=i*cos(d)-j*sin(d);
y=i*sin(d)+j*cos(d);
Top
4 楼hdaq(一生何求)回复于 2002-10-10 21:28:44 得分 0
搜索一下以前的帖子,有好多。Top
5 楼shh03(半山腰)回复于 2002-10-10 21:51:12 得分 0
to sjd163(sjd163):
是图形学中的吧,学过了好久都没用过,书中又没有代码,好像涉及到了
矩阵操作吧,有没有简单一点的
Top
6 楼CCLIS(www.cclis.com)回复于 2002-10-10 23:21:49 得分 5
建议看一下
VC图象处理 这本书,程序是用VC写的,算法经典。Top
7 楼jishiping(JSP 季世平)回复于 2002-10-11 01:14:53 得分 20
单色DIB顺时针旋转90度:
HANDLE RotateMonoDib(HANDLE hDib)
{
int W0, H0;
int Pitch0;
int Pitch1;
BYTE Mask0;
BYTE Mask1;
BYTE *p0, *p1;
HANDLE hDib1;
BITMAPINFOHEADER* pbih;
BITMAPINFOHEADER* pbih1;
pbih = (BITMAPINFOHEADER*)
GlobalLock(hDib);
if (pbih==NULL) return NULL;
if (pbih->biBitCount != 1) {
//不是单色的Dib
GlobalUnlock(hDib);
return NULL;
}
W0 = pbih->biWidth;
H0 = pbih->biHeight;
Pitch0 = (W0+31)/32*4;
Pitch1 = (H0+31)/32*4;
hDib1 = GlobalAlloc(GHND,
Pitch1*W0);
if (hDib1 == NULL) {
//内存不够
GlobalUnlock(hDib);
return NULL;
}
pbih1 = (BITMAPINFOHEADER*)
GlobalLock(hDib1);
memcpy(pbih1, pbih, 40+4*2);
pbih1->biWidth = H0;
pbih1->biHeight = W0;
pbih1->biSizeImage = 0;
p1 = (BYTE*)(pbih1+1) + 4*2;
memset(p1, 0, Pitch1*W0);
for(int h=0; h<W0; h++) {
int X0 = W0 - 1 - h;
Mask0 = 0x80 >> (X0%8);
Mask1 = 0x80;
p0 = (BYTE*)(pbih+1) +
4*2 + (X0 / 8);
p1 = (BYTE*)(pbih1+1) +
4*2 + Pitch1 * h;
for(int w=0; w<H0; w++) {
if (*p0 & Mask0)
*p1 |= Mask1;
if ((Mask1>>=1)==0) {
Mask1 = 0x80; p1++;
}
p0 += Pitch0;
}
}
GlobalUnlock(hDib);
GlobalUnlock(hDib1);
return hDib1;
}Top




