Bitmap Rotation

Posted on 1997-05-12
Last Modified: 2010-04-06
how do I rotate the bitmap in a standard TBitmap say 90 degrees left or right
Question by:elessar
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 2

Accepted Solution

erajoj earned 50 total points
ID: 1336157
I had no clue whatsoever howto rotate a bitmap fast... I had to find out.
This code is fast(!/?). And it can rotate a TImage at ANY
Set the arbangle real to what you want and the rest will be done
for you:

procedure TMainForm.Image1DblClick(Sender: TObject);
  points      : array[0..3] of TPoint;
  bmp         : TBitmap; { temporary storage }
  index       : Integer;
  minx, miny  : Integer;
  maxx, maxy  : Integer;
  arbangle, r : Real;

  function min(a, b: Integer): Integer;
    if a<b then result := a else result := b;

  function max(a, b: Integer): Integer;
    if a>b then result := a else result := b;

  arbangle := 5; { arbitrary angle, can be any angle }
  if sender is TImage then with (sender as TImage) do { Is it a TImage? }
  if not picture.bitmap.empty then begin              { Is it a bitmap? }
    bmp := TBitmap.Create;
    r := Math.Degtorad(arbangle);
    { Some lame maths }
    points[0].x := round(width-(cos(r)*width-sin(r)*height));
    points[0].y := round(height-(sin(r)*width+cos(r)*height));
    points[1].x := round(width+sin(r)*height);
    points[1].y := round(height-cos(r)*height);
    points[2].x := round(width-cos(r)*width);
    points[2].y := round(height-sin(r)*width);
    points[3].x := Width;
    points[3].y := Height;
    { Remove negative coordinates }
    minx := min(points[0].x, min(points[1].x, min(points[2].x, points[3].x)));
    miny := min(points[0].y, min(points[1].y, min(points[2].y, points[3].y)));
    for index := 0 to 3 do begin
      dec(points[index].x, minx);
      dec(points[index].y, miny);
    maxx := max(points[0].x, max(points[1].x, max(points[2].x, points[3].x)));
    maxy := max(points[0].y, max(points[1].y, max(points[2].y, points[3].y)));
    { Set size }
    bmp.width  := maxx;
    bmp.Height := maxy;
    { Here's the magic }
    if not PlgBlt(
      bmp.canvas.handle, // handle of destination device context
      points,               // vertices of destination parallelogram
      canvas.handle,       // handle of source device context
      0,                // x-coord. of upper-left corner of source rect.
      0,                // y-coord. of upper-left corner of source rect.
      Width,             // width of source rectangle
      Height,             // height of source rectangle
      0,                 // handle of bitmask
      0,                 // x-coord. of upper-left corner of bitmask rect.
      0                   // y-coord. of upper-left corner of bitmask rect.
     ) then { errorhandling stuff };
     { Could possibly have been done in a better way }
     picture.bitmap.Width  := bmp.Width;
     picture.bitmap.Height := bmp.Height;
     canvas.draw(0, 0, bmp);


Hope you can use it!

/// John


Author Comment

ID: 1336158
exactly what I was looking for ta! - since I have also posted this question on newsgroups and some people have requested that if I get any replies could I forward them... any objections if I pass this code around?

Expert Comment

ID: 1336159
No objections whatsoever!
Just make sure to mention that you got it via
the Experts Exchange.

/// John

Featured Post

[Live Webinar] The Cloud Skills Gap

As Cloud technologies come of age, business leaders grapple with the impact it has on their team's skills and the gap associated with the use of a cloud platform.

Join experts from 451 Research and Concerto Cloud Services on July 27th where we will examine fact and fiction.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

The uses clause is one of those things that just tends to grow and grow. Most of the time this is in the main form, as it's from this form that all others are called. If you have a big application (including many forms), the uses clause in the in…
In this tutorial I will show you how to use the Windows Speech API in Delphi. I will only cover basic functions such as text to speech and controlling the speed of the speech. SAPI Installation First you need to install the SAPI type library, th…
Do you want to know how to make a graph with Microsoft Access? First, create a query with the data for the chart. Then make a blank form and add a chart control. This video also shows how to change what data is displayed on the graph as well as form…
This tutorial will teach you the special effect of super speed similar to the fictional character Wally West aka "The Flash" After Shake : All lightning effects with instructions : http://www.mediaf…
Suggested Courses
Course of the Month7 days, 9 hours left to enroll

632 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question