图象旋转(30分)

  • 主题发起人 主题发起人 onedolph
  • 开始时间 开始时间
O

onedolph

Unregistered / Unconfirmed
GUEST, unregistred user!
我要做一个图象处理的程序,处理图象旋转时有一点失真.各位有没有好的
不失真(或尽量少失真)的算法(绕某一点旋转任意角度,0---360度).
 
对于点阵图像来说除非旋转90度的整数倍,不然总要有失真

你发现的失真在哪方面?是不是直线不再直了而是像锯齿?
那么说不定要用AntiAlias技术


 
to pegasus
是呀,就是有锯齿,你说的AntiAlias技术有资料吗?
 
procedure RotateBmp(bmp: TBitmap; Center: TPoint; angle: Integer);
var
tmpbmp: TBitmap;
i, j, x, y, px, py: Integer;
cAngle, sAngle: extended;
p1, p2: Pchar;
begin
while angle < 0 do
angle := angle + 360;
angle := angle mod 360;
sAngle := sin(- angle * pi / 180);
cAngle := cos(- angle * pi / 180);
tmpbmp := tbitmap.create;
tmpbmp.assign(bmp);
for i := 0 to tmpbmp.height - 1 do
begin
p1 := pchar(tmpbmp.scanline);
py := 2 * (i - center.y) - 1;
for j := 0 to tmpbmp.width - 1 do
begin
px := 2 * (j - center.x) - 1;
x := (round(px * cAngle - py * sAngle) - 1) div 2 + center.x;
y := (round(px * sAngle + py * cAngle) - 1) div 2 + center.y;
if (x>=0) and (x<tmpbmp.width) and (y>=0) and (y<=tmpbmp.height) then
begin
p2 := pchar(bmp.scanline[y]) + x * 3;
move(p1^, p2^, 3);
end;
inc(p1, 3);
end;
end;
end;
 
正在研究1stClass中的SmoothStretch, 那玩意速度很快, 而且很光滑. 算法值得借鉴(还没看懂).
 
onedolph:
有这两位高手参与解决,你的问题应该不是问题了。 :)
 
to Another_eYes:
上回给过你100分了,还要?:-) 你的手这么高,以后有什么问题我直接写E_Mail
给你得了。
你贴的这个过程从速度来说,比我做的还快。但有一点点问题,我开发用的操作
系统是NT 4.0 ,这个过程不能运行,编译好后拿到98下可以运行,没有出错提示,
不知为何。好象效果也不比我的好到那里。麻烦你再改进一下。
你的1stClass研究得怎样了?
 
估计你的nt是256色的.
tmpbmp := tbitmap.create;
tmpbmp.assign(bmp);
tmpbmp.pixelformat := pf24bit; // 加上这句再试试.

另外最后忘记释放tmpbmp了.
1stclass的smoothstretch正在研究, 它里面变量定义得太多,而且变量名差不多(x, px, cx,....), 要看明白很不容易.

分当然多多益善啦 (eYes准备冲击第一了).
 
各位都是高手!
只是有一点我不明白:why 不利用画布中的像素进行旋转,我曾在一商业程序中使用过
效果不错!
 
shengjun, 我就是利用象素在旋转呀.
你的意思是pixels[x, y]???
那玩意太慢了.
 
sorry! 看走眼了,scanline的速度确实挺快!
 
1stClass中的SmoothStretch?where?
 
用delphix可以轻松实现
 
不好意思,请教何晓峰delphix是"何物"?
 
是套封装了directX的控件. 做游戏有用.
 
to Another_eYes:
你知道?还有别的线索吗?怎样才能找到delphix?
 
to Another_eYes:
我想你的RotateBmp过程也是"现炒现卖"的吧,麻烦再帮我de一下bug.
 
一天了,怎么没有人响应?Another_eYes去那儿了,我很想给你分啊!
忽然发现一个问题,我现在看到的RotateBmp过程怎么与我第一次看到的不一样呢,
难道贴出来还可以改的?
 
我研究了1stclass的smoothstretch, 发觉只有在图象大小改变了的情况下它才会进行smooth处理. 要不处理时先smoothstretch扩大原图, 再旋转, 再smoothstretch缩小?
 
to: onedolph
你可以试一下api XFORM,里面有你所需的变换.
 
后退
顶部