(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
arnolduAsked:
Who is Participating?

[Product update] Infrastructure Analysis Tool is now available with Business Accounts.Learn More

x
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

jbrugmanCommented:
a method to rotate an image on the web, i would use JavaScript. The images are rotated already with a tool like Photoshop.
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'].src = eval('single' + (++singleI) + ".src");
         singleInTimeout = setTimeout('fadeInabout()',60);
     }
 }

function thisfirst() {
   if (singleI >= 8) {
       singleI=0
   }
   clearTimeout(singleInTimeout);
}

</SCRIPT>
<BODY>

<IMG SRC="images/aboutstar_0.gif" NAME="single" BORDER="0">
<BR><BR>
<A HREF="pagina_01.html" TARGET="Right" onMouseover=thisfirst();fadeInabout()>  
About Star</A>

0
arnolduAuthor Commented:
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 °)
0
jbrugmanCommented:
Why don't u use a tool like Photoshop or a shareware program like paintshop pro then?
0
Microsoft Azure 2017

Azure has a changed a lot since it was originally introduce by adding new services and features. Do you know everything you need to about Azure? This course will teach you about the Azure App Service, monitoring and application insights, DevOps, and Team Services.

arnolduAuthor Commented:
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.

0
jbrugmanCommented:
Perhaps it is an idea to post the question in another place then, like in programming C / C++
Good luck!
0
ozoCommented:
how about composing sheer transforms?
0
arnolduAuthor Commented:
Good idea - but how to implement them with interpolation?
0
ozoCommented:
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

0
mrauschCommented:
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.

0
ozoCommented:
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)
0
hlavaCommented:
try write for each pixel code like(in math):

xx=xb*cos(alfa)-yb*sin(alfa)
yy=xb*sin(alfa)+yb*cos(alfa)

xx-result x
yy-result y
xb-start x
yb-start y
alfa-angle

if you can use rotation about one point you must get this point to 0,0 and then rotate

shifting code(math):
xx=xb+xshift
yy=yb+yshift

good luck!!

                                 HEAD
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Web Graphics Software

From novice to tech pro — start learning today.