::: 델파이 Tip&Trick :::

델파이 Tip&Trick 성격에 맞지 않는 광고,비방,질문의 글은 즉시 삭제하며
내용을 복사하여 사용할 경우 반드시 이곳(http://www.howto.pe.kr)을 출처로 명시하여 주세요


Category

  김영대(2003-03-04 20:49:13, Hit : 5424, Vote : 1216
 Image의 90도 회전

안녕하세요  김영대입니다
아래는 제가 사용했었던 자료인데요
무리없이 잘 실행되었습니다
참고하세요

"Here's code to rotate a bitmap 90
degrees"

From: Dave Shapiro

Counterclockwise, that is. This rotates a 640x480 24-bit bitmap 90 degrees in
about 2/10 of sec on my P133 (4MB video card, 128MB RAM). It works for
Delphi 2, and should work for 1 and 3, too.

One thing: This does not work for bitmaps that aren't an integral number of colors
per pixel. If that's the case, you'll have to do some bit twiddling. I'm working on that
part right now (I need it too), but it'll be a few days. Anyways, suggestions,
comments, etc., always welcome.

Special thanks to David Ullrich (ooh, I hope I spelled that correctly) for pointing out
the non-published-but-public-anyway SaveToStream method for the TBitmap class.

Advance apologies for any formatting problems. Netscape's editor is so ridiculously
crippled that I can't accomplish anything (give me rtin and vim any day).



procedure RotateBitmap90Degrees(ABitmap: TBitmap);

const
  BITMAP_HEADER_SIZE = SizeOf(TBitmapFileHeader) +
SizeOf(TBitmapInfoHeader);

var
  { Things that end in R are for the rotated image. }
  PbmpInfoR: PBitmapInfoHeader;
  bmpBuffer, bmpBufferR: PByte;
  MemoryStream, MemoryStreamR: TMemoryStream;
  PbmpBuffer, PbmpBufferR: PByte;
  PbmpBufferRFirstScanLine, PbmpBufferColumnZero: PByte;
  BytesPerPixel, BytesPerScanLine, BytesPerScanLineR: Integer;
  X, Y, T: Integer;

begin
  {
    Don't *ever* call GetDIBSizes! It screws up your bitmap.
    I'll be posting about that shortly.
  }

  MemoryStream := TMemoryStream.Create;

  {
   To do: Put in a SetSize, which will eliminate any reallocation
   overhead.
  }

  ABitmap.SaveToStream(MemoryStream);

  {
   Don't need you anymore. We'll make a new one when the time comes.
  }
  ABitmap.Free;

  bmpBuffer := MemoryStream.Memory;

  { Set PbmpInfoR to point to the source bitmap's info header. }
  { Boy, these headers are getting annoying. }
  Inc( bmpBuffer, SizeOf(TBitmapFileHeader) );
  PbmpInfoR := PBitmapInfoHeader(bmpBuffer);

  { Set bmpBuffer to point to the original bitmap bits. }
  Inc(bmpBuffer, SizeOf(PbmpInfoR^));
  { Set the ColumnZero pointer to point to, uh, column zero. }
  PbmpBufferColumnZero := bmpBuffer;

  with PbmpInfoR^ do
  begin
    BytesPerPixel := biBitCount shr 3;
    { ScanLines are DWORD aligned. }
    BytesPerScanLine := ((((biWidth * biBitCount) + 31) div 32) * SizeOf(DWORD));
    BytesPerScanLineR := ((((biHeight * biBitCount) + 31) div 32) * SizeOf(DWORD));

    { The TMemoryStream that will hold the rotated bits. }
    MemoryStreamR := TMemoryStream.Create;
    {
     Set size for rotated bitmap. Might be different from source size
     due to DWORD aligning.
    }
    MemoryStreamR.SetSize(BITMAP_HEADER_SIZE  + BytesPerScanLineR * biWidth);
  end;

  { Copy the headers from the source bitmap. }
  MemoryStream.Seek(0, soFromBeginning);
  MemoryStreamR.CopyFrom(MemoryStream, BITMAP_HEADER_SIZE);

  { Here's the buffer we're going to rotate. }
  bmpBufferR := MemoryStreamR.Memory;
  { Skip the headers, yadda yadda yadda... }
  Inc(bmpBufferR, BITMAP_HEADER_SIZE);

  {
   Set up PbmpBufferRFirstScanLine and advance it to end of the first scan
   line of bmpBufferR.
  }
  PbmpBufferRFirstScanLine := bmpBufferR;
  Inc(PbmpBufferRFirstScanLine, (PbmpInfoR^.biHeight - 1) * BytesPerPixel);

  { Here's the meat. Loop through the pixels and rotate appropriately. }

  { Remember that DIBs have their origins opposite from DDBs. }
  for Y := 1 to PbmpInfoR^.biHeight do
  begin
    PbmpBuffer := PbmpBufferColumnZero;
    PbmpBufferR := PbmpBufferRFirstScanLine;

    for X := 1 to PbmpInfoR^.biWidth do
    begin
      for T := 1 to BytesPerPixel do
      begin
        PbmpBufferR^ := PbmpBuffer^;
        Inc(PbmpBufferR);
        Inc(PbmpBuffer);
      end;
      Dec(PbmpBufferR, BytesPerPixel);
      Inc(PbmpBufferR, BytesPerScanLineR);
    end;

    Inc(PbmpBufferColumnZero, BytesPerScanLine);
    Dec(PbmpBufferRFirstScanLine, BytesPerPixel);
  end;

  { Done with the source bits. }
  MemoryStream.Free;

  { Now set PbmpInfoR to point to the rotated bitmap's info header. }
  PbmpBufferR := MemoryStreamR.Memory;
  Inc( PbmpBufferR, SizeOf(TBitmapFileHeader) );
  PbmpInfoR := PBitmapInfoHeader(PbmpBufferR);

  { Swap the width and height of the rotated bitmap's info header. }
  with PbmpInfoR^ do
  begin
    T := biHeight;
    biHeight := biWidth;
    biWidth := T;
  end;

  ABitmap := TBitmap.Create;

  { Spin back to the very beginning. }
  MemoryStreamR.Seek(0, soFromBeginning);
  ABitmap.LoadFromStream(MemoryStreamR);

  MemoryStreamR.Free;
end;






971   [네트웍/인터넷] Internet에 연결중인지 여부를 알려면...  김영대 2003/03/04 5378 1396
970   [윈도우즈 API] 델파이 3.0에서 한글변환을 하는법....  김영대 2003/03/04 6203 1487
969   [시스템] 떠 있는 프로그램 죽이기...  김영대 2003/03/04 6115 1467
968   [시스템] 다른 Application 생성과 소멸에 대하여...  김영대 2003/03/04 5015 1366
967   [윈도우즈 API] 도구모음 Bar는 어떻게 만드는지...  김영대 2003/03/04 4883 1386
966   [일반/컴포넌트] StringGrid의 Cell에 입력 값 제한 하기  김영대 2003/03/04 6333 1336
965   [데이터베이스] DB의 Blob필드에 화일을 저장하기  김영대 2003/03/04 5293 1288
964   [시스템] Windows NT 에서 한글 NT인지 영문 NT인지 구분하는 방법  김영대 2003/03/04 6946 1408
963   [시스템] 오직 하나의 프로그램만 실행...  김영대 2003/03/04 5250 1415
962   [데이터베이스] TBlobField에 대한 사용법  김영대 2003/03/04 5152 1325
961   [멀티미디어] TMedia Player에서 BMP파일로 저장하기(화면 capture)  김영대 2003/03/04 4764 1319
960   [일반/컴포넌트] StringGrid에서 Enter Key를 Tab Key와 같은 효과  김영대 2003/03/04 5446 1253
959   [데이터베이스] Stored Procedure 작성을 어떻게 하나  김영대 2003/03/04 5104 1334
958   [윈도우즈 API] 날짜변형에 대해서...  김영대 2003/03/04 5059 1274
957   [윈도우즈 API] 델파이에서 시간을 기다리는 함수  김영대 2003/03/04 6354 1413
956   [데이터베이스] DBGrid에서 MultiSelect된것 알아내려면...  김영대 2003/03/04 5807 1314
955   [윈도우즈 API] 외부 프로그램의 윈도우 크기 조절  김영대 2003/03/04 5368 1330
954   [윈도우즈 API] 클립보드로 복사  김영대 2003/03/04 5858 1471
953   [일반/컴포넌트] VB Left$(), Right$(), LTrim$() ...  김영대 2003/03/04 4982 1249
952   [윈도우즈 API] 화면캡처하기 Delphi3.0에서...  김영대 2003/03/04 4886 1327
951   [데이터베이스] 엑셀자료를 읽어서 DB에 UPDATE  김영대 2003/03/04 5360 3603
950   [시스템] 프린터 상태가 Ready인지 아닌지 검사  김영대 2003/03/04 6086 1843
949   [데이터베이스] DBGrid 에서 선택된 필드의 타이틀을 굵게  김영대 2003/03/04 4911 1356
948   [윈도우즈 API] bitmap을 JPEG로 변환  김영대 2003/03/04 5117 1389
947   [데이터베이스] DBGrid의 Column, Record 의 위치 저장/이동  김영대 2003/03/04 10813 2170
946   [데이터베이스] ORACLE 나 SQL Server 에서 레코드 번호  김영대 2003/03/04 5211 1328
945   [윈도우즈 API] 키보드의 임의키 발생  김영대 2003/03/04 5588 1396
944   [데이터베이스] BDE 버전정보  김영대 2003/03/04 4223 1190
943   [일반/컴포넌트] 문자열의 암호화(Password 처리)  김영대 2003/03/04 4532 1134
  [일반/컴포넌트] Image의 90도 회전  김영대 2003/03/04 5424 1216
941   [윈도우즈 API] 파일정보(생성,변경,접근일자,속성,종류...)  김영대 2003/03/04 5578 1307
940   [윈도우즈 API] 윈도우즈 탐색기와의 연동  김영대 2003/03/04 5844 1396
939   [시스템] 절약형 모니터의 켜기/끄기  김영대 2003/03/04 4856 1356
938   [시스템] 드라이브 포맷(Format) API 함수  김영대 2003/03/04 4876 1337
937   [일반/컴포넌트] virtual keys 리스트  김영대 2003/03/04 4292 1239
936   [윈도우즈 API] short/long file name 변환  김영대 2003/03/04 4359 1289
935   [일반/컴포넌트] 메뉴 아이템의 동적 추가와 그림넣기  김영대 2003/03/04 7842 1253
934   [윈도우즈 API] 파일의 확장명으로 실행화일 연결  김영대 2003/03/04 5160 1378
933   [시스템] CD-ROM 문 열기/닫기  김영대 2003/03/04 4914 1413
932   [일반/컴포넌트] QReport에서 출력된 자료를 Text화일로 저장  김영대 2003/03/04 4601 1267

1 [2][3][4][5][6][7][8][9][10]..[25] [다음 10개]
 

Copyright 1999-2021 Zeroboard / skin by zero