Текущий архив: 2007.07.22;
Скачать: CL | DM;
Вниз
Работа с растровым изображением. Найти похожие ветки
← →
olegnik (2006-10-30 12:53) [0]Столкнулся с задачей следующего характера:
есть растровое изображение ( прямоугольник 200 на 600 pix)
необходимо произвести:
1 его поворот 0 - 360 градусов
2 растянуть (сжать) по высоте (длине)
3 привязать изображение к новым координатам
быду благодарен за исхдник или за описания алгоритмов, выполняющих эти задачи
← →
@!!ex © (2006-10-30 15:19) [1]1) Матрица поворота(Будут артефакты в виду пустых пикселей, но убрать то их не проблема)
2) Матрица изменения размера(При увеличении изображения будут артефакты как при повороте)
3) Матрица перемещения
← →
Rial © (2006-10-30 17:26) [2]procedure Interpolate(Const Bitmap:TBitMap;Const DX,DY:Single);
Var TempBitmap:TBitMap;
Z1,Z2:Single;
K,K1,K2:Single;
X1,Y1:Integer;
C:Array[0..1, 0..1, 0..2] of Byte;
Res:Array[0..2]of Byte;
X,Y:Integer;
Xp,Yp:Integer;
Xo,Yo:Integer;
Col:Integer;
BS,TBS:TBitmapStream;
W,H,TH,TW:Integer;
ptPix,ptTPix:Integer;
ptCol,ptTCol:ptVoidArray;
begin
TempBitmap:=TBitMap.Create;
TempBitmap.Width:=Round(Bitmap.Width*DX);
TempBitmap.Height:=Round(Bitmap.Height*DY);
BS:=TBitmapStream.Create(Bitmap);
TBS:=TBitmapStream.Create(TempBitmap);
Try
ptPix:=Integer(BS.Memory);
ptTPix:=Integer(TBS.Memory);
H:=Bitmap.Height;
W:=Bitmap.Width;
TH:=TempBitmap.Height;
TW:=TempBitmap.Width;
For Y:=0 to TH-1 do
For X:=0 to TW-1 do begin
Xo:=Trunc(X/DX);
Yo:=Trunc(Y/DY);
X1:=Round(Xo*DX);
Y1:=Round(Yo*DY);
For Yp:=0 to 1 do
For Xp:=0 to 1 do begin
ptCol:=Pointer(ptPix+((Xo+Yp)+(H-Yo-Yp)*W)*3);
For Col:=0 to 2 do C[Xp,Yp,Col]:=ptCol^[2-Col];
end;
For Col:=0 to 2 do begin
K1:=(C[1,0,Col]-c[0,0,Col])/DX;
Z1:=X*K1+C[0,0,Col]-X1*K1;
K2:=(C[1,1,Col]-C[0,1,Col])/DX;
Z2:=X*K2+C[0,1,Col]-X1*K2;
K:=(Z2-Z1)/DY;
Res[Col]:=Round(Y*K+Z1-Y1*K);
end;
ptTCol:=Pointer(ptTPix+(Y*TW+X)*3);
For Col:=0 to 2 do ptTCol^[Col]:=Res[2-Col];
end;
TBS.Flush(TempBitmap);
Bitmap.Assign(TempBitmap);
finally
TempBitmap.Free;
BS.Free;
end;
end;
constructor TBitmapStream.Create(Const Bitmap:TBitmap);
begin
With BMinfo.bmiHeader do begin
FillChar(BMInfo,SizeOf(BMInfo),0);
biSize:=sizeof(TBitMapInfoHeader);
biBitCount:=24;
biWidth:=Bitmap.Width;
biHeight:=Bitmap.Height;
ImageSize:=biWidth*biHeight*3;
biPlanes:=1;
biCompression:=BI_RGB;
MemDC:=CreateCompatibleDC(0);
GetMem(Data,ImageSize);
GetDIBits(MemDC,BitMap.Handle,0,biHeight,Data,BMInfo,DIB_RGB_COLORS);
end;
end;
destructor TBitmapStream.Destroy;
begin
FreeMem(Data);
inherited Destroy;
end;
procedure TBitmapStream.Flush(Const DestBitmap:TBitmap);
begin
With BMinfo.bmiHeader do
SetDIBits(MemDC,DestBitmap.Handle,0,biHeight,Data,BMInfo,DIB_RGB_COLORS);
end;
TBitmapStream=Class
protected
Data:Pointer;
BMInfo:TBitMapInfo;
ImageSize:Integer;
MemDC:HDC;
public
constructor Create(Const Bitmap:TBitmap);
destructor Destroy;override;
procedure Flush(Const DestBitmap:TBitmap);
property Memory:Pointer read Data;
property DataSize:Integer read ImageSize;
end;
← →
Rial © (2006-10-30 17:29) [3]Ну а поворот - совсем просто.
X" = X * cos(A) - Y * sin(A)
Y" = X * sin(A) + Y * cos(A)
Страницы: 1 вся ветка
Текущий архив: 2007.07.22;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.034 c