Still celebrating National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
?
Solved

Bitmap Rotation

Posted on 1997-05-12
3
Medium Priority
?
406 Views
Last Modified: 2010-04-06
how do I rotate the bitmap in a standard TBitmap say 90 degrees left or right
0
Comment
Question by:elessar
[X]
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
3 Comments
 
LVL 4

Accepted Solution

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

procedure TMainForm.Image1DblClick(Sender: TObject);
var
  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;
  begin
    if a<b then result := a else result := b;
  end;

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

begin
  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);
    end;
    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);
     bmp.Free;
  end;

end;

Hope you can use it!

/// John

0
 

Author Comment

by:elessar
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?
0
 
LVL 4

Expert Comment

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

/// John
0

Featured Post

Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

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

Hello everybody This Article will show you how to validate number with TEdit control, What's the TEdit control? TEdit is a standard Windows edit control on a form, it allows to user to write, read and copy/paste single line of text. Usua…
Introduction Raise your hands if you were as upset with FireMonkey as I was when I discovered that there was no TListview.  I use TListView in almost all of my applications I've written, and I was not going to compromise by resorting to TStringGrid…
In this video you will find out how to export Office 365 mailboxes using the built in eDiscovery tool. Bear in mind that although this method might be useful in some cases, using PST files as Office 365 backup is troublesome in a long run (more on t…
Have you created a query with information for a calendar? ... and then, abra-cadabra, the calendar is done?! I am going to show you how to make that happen. Visualize your data!  ... really see it To use the code to create a calendar from a q…
Suggested Courses

715 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