高分求图像无损旋转算法! (200分)

  • 主题发起人 主题发起人 kmwh
  • 开始时间 开始时间
K

kmwh

Unregistered / Unconfirmed
GUEST, unregistred user!
我试过大富翁上的很多算法,也试过ImageEn,旋转后图像都有一点失真.而达不到AcdSee
的效果,不知道AcdSee是怎么处理的.
那位有这方面的经验,请赐教,不胜感激!
分数好说,不够就另开贴[:D]
 
读DELPHIX的原代码吧
类TIMAGESPRITEEX
属性:angle
 
谢谢您回答,请问DELPHIX在哪可以下载?
 
很多地方都可以,你可以搜索一下
找到了吗?如果不好找告诉我邮箱,我发给你,但是你的成果(算法)分析的论文到时发
给我一个好吗?呵呵
 
谢谢,我看了,那个好像只能以90度为单位旋转,有能任意角度旋转而不怎么失真的吗?
 
什么?可以任意角度的,我做的项目用到的,你确定?
肯定是任意角度不失真。
 
sorry,我再看看[:)]
 
完全不失真是不可能的,
你可以用Graphic32试一下
http://www.g32.org/
 
幫你頂一下
 
个人认为GraphicEx可以,版本9.0,有源代码
在《Delphi 7项目开发实践》(1CD)中有这个控件及其使用方法
 
这个不是很难的啊。我以前做扑克库时做过,不过,是用VC做的。可以任意转的。
 
不可能没有失真的.只是补偿大小的问题.精度越高速度越慢.. 可以参考graphic32的源码.
http://www.g32.org/
 
值的学习!
 
//别忘了定义
const MAX_PIXELCOUNT = 32768;
type
PRGBArray = ^TRGBArray;
TRGBArray = array[0 .. MAX_PIXELCOUNT - 1] of TRGBTriple;
//逆时针旋转任意角度,单位度
procedure Rotate(const Center: TPoint; const Angle: Integer;
const CornerColor: TColor; FBitmap: TBitmap);
{ rotate FBitmap about the given center
through any angle counterclockwisely. Angle is in degree!
Bitmap size will not change, thus has "corner effect". }
var
cosTheta, sinTheta: extended;
x, xOriginal, xPrime, y, yOriginal, yPrime : integer;
RowSrc, RowDest: PRGBArray;
Bmp: TBitmap;
begin
Bmp := TBitmap.Create; {create a temp. bitmap}
try
Bmp.Assign(FBitmap); {copy exactly from the internal bitmap}
SinCos(Angle / 180 * Pi, sinTheta, cosTheta);
{Get SIN and COS in a single call,
but must convert angle to radian beforehand}
for y := Height - 1 downto 0 do
begin
RowDest := FBitmap.Scanline[y]; {scan every line of dest bitmap}
yPrime := y - Center.Y;
for x := Width - 1 downto 0 do
begin
xPrime := x - Center.X;
xOriginal := Center.X + Round(xPrime * cosTheta - yPrime * sinTheta);
yOriginal := Center.Y + Round(xPrime * sinTheta + yPrime * cosTheta);
{applying formula}
if (xOriginal >= 0) and (xOriginal <= Width - 1) and
(yOriginal >= 0) and (yOriginal <= Height - 1) then
{ if xOriginal, yOriginal is in the bitmap }
begin
RowSrc := Bmp.Scanline[yOriginal];
RowDest[x] := RowSrc[xOriginal];
{ assign pixel from Source bitmap to the internal bitmap }
end
else { if xOriginal, yOriginal is out of the bitmap }
with RowDest[x] do
begin
rgbtRed := GetRValue(CornerColor);
rgbtGreen := GetGValue(CornerColor);
rgbtBlue := GetBValue(CornerColor);
{assign CornerColor to the corner}
end; {end of with}
end;
end;
finally
Bmp.Free
end;
end;
 
//上面的是旋转任意角度
//这个是顺时针90度
procedure RotateClockwise(FBitmap: TBitmap);
{ rotate the FBitmap 90 deg clockwisely
bitmap size will change }
var
x, y: integer;
RowSrc, RowDest: PRGBArray;
Bmp:TBitmap;
begin
Bmp := TBitmap.Create; {create a temp. bitmap}
try
Bmp.Assign(FBitmap); {copy exactly from the internal bitmap}
FBitmap.Width := Height;
FBitmap.Height := Width; {change the size}
FWidth := FBitmap.Width;
FHeight := FBitmap.Height; {update width and height info}
for y := 0 to Bmp.Height - 1 do
begin
RowSrc := Bmp.ScanLine[y]; {scan every line of the source bitmap}
for x := 0 to Bmp.Width - 1 do
begin
RowDest := FBitmap.ScanLine[x];
with RowDest[Bmp.Height - 1 - y] do
begin
rgbtRed := RowSrc[x].rgbtRed;
rgbtGreen := RowSrc[x].rgbtGreen;
rgbtBlue := RowSrc[x].rgbtBlue;
end; {end of with}
{get RGB for destination bitmap i.e. the internal bitmap}
{eg: assum original width = 10, height = 5;
then resultant width = 5, height = 10;
Src Dest
[0, 0] [4, 0]
[2, 3] [1, 2]
in general,
[x, y] [5 - 1 - y, x] }
end;
end;
finally
Bmp.Free;
end;
end;
//这个是逆时针90度
procedure RotateCounterClockwise(FBitmap: TBitmap);
{ rotate FBitmap 90 deg counter-clockwisely
bitmap size will change }
var
x, y: integer;
RowSrc, RowDest: PRGBArray;
Bmp:TBitmap;
begin
Bmp := TBitmap.Create; {create a temp. bitmap}
try
Bmp.Assign(FBitmap); {copy exactly from the internal bitmap}
FBitmap.Width := Height;
FBitmap.Height := Width; {change the size}
FWidth := FBitmap.Width;
FHeight := FBitmap.Height; {update width and height info}
for y := 0 to Bmp.Height - 1 do
begin
RowSrc := Bmp.ScanLine[y]; {scan every line of the source bitmap}
for x := 0 to Bmp.Width - 1 do
begin
RowDest := FBitmap.ScanLine[Bmp.Width - 1 - x];
With RowDest[y] do
begin
rgbtRed := RowSrc[x].rgbtRed;
rgbtGreen := RowSrc[x].rgbtGreen;
rgbtBlue := RowSrc[x].rgbtBlue;
end; {end of with}
{get RGB for destination bitmap i.e. the internal bitmap}
{eg: assum original width = 10, height = 5;
then resultant width = 5, height = 10;
Src Dest
[0, 0] [9, 0]
[2, 3] [3, 7]
in general,
[x, y] [y, 10 - 1 - x] }
end;
end;
finally
Bmp.Free;
end;
end;
 
任意角的旋转效果都不是很理想
 
绝对不可能

以90度为限制角度才可以不失真

我是做印刷的
而这个是印刷常识
 
关于图像的旋转如果以90为单位的话,可以无损失,其它任意角度肯定会有损失的,当然有好的
算法可以保证失真度更小,但付出的代价就是处理速度变慢。
我用imageen做旋转,觉得质量已经不错了,当然速度没有处理90那么快而已。
 
除非是矢量圖,才可以任意角度旋轉不失真
象素圖隻能旋轉90度的整數倍不失真,其它任意角度都會失真
 
多人接受答案了。
 
后退
顶部