Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.47 MB
Время: 0.026 c
2-1182966867
Ivolg
2007-06-27 21:54
2007.07.22
Проблема с вкладками


2-1182862112
Tonich
2007-06-26 16:48
2007.07.22
Битовая маска


2-1182757805
gentos
2007-06-25 11:50
2007.07.22
Scan


3-1176980413
nod
2007-04-19 15:00
2007.07.22
update sql с подзапросом


2-1183046437
smaller
2007-06-28 20:00
2007.07.22
Как менять фокус ввода при открытии формы разными клавишами ?