arnoldu
asked on
(fast!) 2D rotation and scaling for grayscale bitmaps
I need source code (DELPHI or C) to implement a rather fast method to rotate a grayscale image about small angles (+-3 degrees) and scale it down using antialias. Have found nothing acceptable yet
ASKER
This is a wonderful idea - if rotating images on the web had been the actual question. I obtain images from the scanner and have to correct misalignments etc. and rotate them by small angles (e.g. 0.3 °)
Why don't u use a tool like Photoshop or a shareware program like paintshop pro then?
ASKER
Because I dont have them statically ! My application scans images using a self-written twain interface and I need a kind of preprocessor within my own program to correct for smaller misalignment errrors.
Perhaps it is an idea to post the question in another place then, like in programming C / C++
Good luck!
Good luck!
how about composing sheer transforms?
ASKER
Good idea - but how to implement them with interpolation?
I found this reference in
http://www.cis.ohio-state.edu/hypertext/faq/usenet/graphics/algorithms-faq/faq.html
Subject 3.01: How do I rotate a bitmap?
The easiest way, according to the comp.graphics faq, is to take
the rotation transformation and invert it. Then you just iterate
over the destination image, apply this inverse transformation and
find which source pixel to copy there.
A much nicer way comes from the observation that the rotation
matrix:
R(T) = { { cos(T), -sin(T) }, { sin(T), cos(T) } }
is formed my multiplying three matrices, namely:
R(T) = M1(T) * M2(T) * M3(T)
where
M1(T) = { { 1, -tan(T/2) },
{ 0, 1 } }
M2(T) = { { 1, 0 },
{ sin(T), 1 } }
M3(T) = { { 1, -tan(T/2) },
{ 0, 1 } }
Each transformation can be performed in a separate pass, and
because these transformations are either row-preserving or
column-preserving, anti-aliasing is quite easy.
Reference:
Paeth, A. W., "A Fast Algorithm for General Raster Rotation",
Proceedings Graphics Interface '89, Canadian Information
Processing Society, 1986, 77-81
[Note - e-mail copies of this paper are no longer available]
[Gems I]
...
[Gems I]
Graphics Gems,
Andrew Glassner (ed.), Academic Press 1990, ISBN 0-12-286165-5
http://www.cis.ohio-state.edu/hypertext/faq/usenet/graphics/algorithms-faq/faq.html
Subject 3.01: How do I rotate a bitmap?
The easiest way, according to the comp.graphics faq, is to take
the rotation transformation and invert it. Then you just iterate
over the destination image, apply this inverse transformation and
find which source pixel to copy there.
A much nicer way comes from the observation that the rotation
matrix:
R(T) = { { cos(T), -sin(T) }, { sin(T), cos(T) } }
is formed my multiplying three matrices, namely:
R(T) = M1(T) * M2(T) * M3(T)
where
M1(T) = { { 1, -tan(T/2) },
{ 0, 1 } }
M2(T) = { { 1, 0 },
{ sin(T), 1 } }
M3(T) = { { 1, -tan(T/2) },
{ 0, 1 } }
Each transformation can be performed in a separate pass, and
because these transformations are either row-preserving or
column-preserving, anti-aliasing is quite easy.
Reference:
Paeth, A. W., "A Fast Algorithm for General Raster Rotation",
Proceedings Graphics Interface '89, Canadian Information
Processing Society, 1986, 77-81
[Note - e-mail copies of this paper are no longer available]
[Gems I]
...
[Gems I]
Graphics Gems,
Andrew Glassner (ed.), Academic Press 1990, ISBN 0-12-286165-5
You could quite easily enlarge a "working window" on the
original picture, skew this according to the angle you want to
rotate and scale it down to the desired size. Antialiasing can
be done in this last step without problems.
original picture, skew this according to the angle you want to
rotate and scale it down to the desired size. Antialiasing can
be done in this last step without problems.
I happen to have the Graphics Gems article with me now.
It's too long (and too copyrighted) to type in here, but for the next week or so (until the owner of the book wants it back)
I may be able to answer any furthur questions you have on it.
The article also compares a similar technique that does a 2 pass simultaneous shear and scale.
A.R. Smith (1987) "Planar 2-Pass Texture Mapping and Warping"
ACM Computer Graphics (SIGGRAPH). 21(4), 263-272.
(A Fast Algorithm for General Raster Rotation)
It's too long (and too copyrighted) to type in here, but for the next week or so (until the owner of the book wants it back)
I may be able to answer any furthur questions you have on it.
The article also compares a similar technique that does a 2 pass simultaneous shear and scale.
A.R. Smith (1987) "Planar 2-Pass Texture Mapping and Warping"
ACM Computer Graphics (SIGGRAPH). 21(4), 263-272.
(A Fast Algorithm for General Raster Rotation)
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Rotating can be done with the following script:
<SCRIPT LANGUAGE="JavaScript">
if (document.images != null) {
single0 = new Image();single0.src = "images/aboutstar_0.gif";
single1 = new Image();single1.src = "images/aboutstar_1.gif";
single2 = new Image();single2.src = "images/aboutstar_2.gif";
single3 = new Image();single3.src = "images/aboutstar_3.gif";
single4 = new Image();single4.src = "images/aboutstar_4.gif";
single5 = new Image();single5.src = "images/aboutstar_5.gif";
single6 = new Image();single6.src = "images/aboutstar_6.gif";
single7 = new Image();single7.src = "images/aboutstar_7.gif";
single8 = new Image();single8.src = "images/aboutstar_8.gif";
var singleI = 0, singleInTimeout = singleOutTimeout = null;
}
function fadeInabout() {
if (document.images != null && singleI < 8) {
document.images['single'].
singleInTimeout = setTimeout('fadeInabout()'
}
}
function thisfirst() {
if (singleI >= 8) {
singleI=0
}
clearTimeout(singleInTimeo
}
</SCRIPT>
<BODY>
<IMG SRC="images/aboutstar_0.gi
<BR><BR>
<A HREF="pagina_01.html" TARGET="Right" onMouseover=thisfirst();fa
About Star</A>