delphi 이미지 회전
// 90°
procedure Rotate(Bitmap: TBitmap);
type
THelpRGB = packed record
rgb: TRGBTriple;
dummy: byte;
end;
pRGBArray = ^TRGBArray;
TRGBArray = array[0..32767] of TRGBTriple;
var
aStream: TMemorystream;
//
header: TBITMAPINFO;
dc: hDC;
P: ^THelpRGB;
x, y, b, h: Integer;
RowOut: pRGBArray;
begin
//
aStream := TMemoryStream.Create;
// , 4
aStream.SetSize(Bitmap.Height * Bitmap.Width * 4);
with header.bmiHeader do //
begin
biSize := SizeOf(TBITMAPINFOHEADER); //
biWidth := Bitmap.Width; //
biHeight := Bitmap.Height; //
biPlanes := 1;
biBitCount := 32;
//
biCompression := 0;
biSizeimage := aStream.Size;
biXPelsPerMeter := 1; //
biYPelsPerMeter := 1; //
biClrUsed := 0;
biClrImportant := 0;
end;
dc := GetDC(0);
P := aStream.Memory;
GetDIBits(dc, Bitmap.Handle, 0, Bitmap.Height, P, header, dib_RGB_Colors);
ReleaseDC(0, dc);
b := bitmap.Height; //
h := bitmap.Width; //
//
bitmap.Width := b;
bitmap.height := h;
for y := 0 to (h - 1) do
begin
rowOut := Bitmap.ScanLine[y]; //
P := aStream.Memory; //
inc(p, y); //
for x := 0 to (b - 1) do
begin
rowout[x] := p^.rgb; //
inc(p, h);
end;
end;
aStream.Free; //
end;
뒤에 이거 찾기 힘들어.
// 90°
procedure Rotate2(aBitmap: TBitmap);
var
nIdx, nOfs,
x, y, i, nMultiplier: integer;
nMemWidth, nMemHeight, nMemSize, nScanLineSize: LongInt;
aScnLnBuffer: PChar;
aScanLine: PByteArray;
begin
nMultiplier := 3;
nMemWidth := aBitmap.Height;
nMemHeight := aBitmap.Width;
//
nMemSize := nMemWidth * nMemHeight * nMultiplier;
//
GetMem(aScnLnBuffer, nMemSize);
try
//Scanline
nScanLineSize := aBitmap.Width * nMultiplier;
// ScanLine
GetMem(aScanLine, nScanLineSize);
try
for y := 0 to aBitmap.Height - 1 do
begin
//
Move(aBitmap.ScanLine[y]^, aScanLine^, nScanLineSize);
for x := 0 to aBitmap.Width - 1 do
begin
nIdx := ((aBitmap.Width - 1) - x) * nMultiplier;
nOfs := (x * nMemWidth * nMultiplier) + (y * nMultiplier);
for i := 0 to nMultiplier - 1 do
Byte(aScnLnBuffer[nOfs + i]) := aScanLine[nIdx + i];
end;
end;
// ,
aBitmap.Height := nMemHeight;
aBitmap.Width := nMemWidth;
for y := 0 to nMemHeight - 1 do
begin
//
nOfs := y * nMemWidth * nMultiplier;
Move((@(aScnLnBuffer[nOfs]))^, aBitmap.ScanLine[y]^, nMemWidth *
nMultiplier);
end;
finally
// aScanLine
FreeMem(aScanLine, nScanLineSize);
end;
finally
// aScnLnBuffer
FreeMem(aScnLnBuffer, nMemSize);
end;
end;
전재 대상:https://www.cnblogs.com/doorsky/p/5596490.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.