Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа с растровым изображением.


olegnik ©   (2006-10-30 12:53:00) 

Столкнулся с задачей следующего характера:
есть растровое изображение ( прямоугольник  200 на 600 pix)
необходимо произвести:
1 его поворот 0 - 360 градусов
2 растянуть (сжать) по высоте (длине)  
3 привязать изображение к новым координатам
быду благодарен за исхдник или за описания алгоритмов, выполняющих эти задачи


Rial   (2006-10-30 17:29:00) [1]

Ну а поворот - совсем просто.

X' = X * cos(A) - Y * sin(A)
Y' = X * sin(A) + Y * cos(A)


Rial   (2006-10-30 17:26:00) [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;


@!!ex   (2006-10-30 15:19:00) [3]

1) Матрица поворота(Будут артефакты в виду пустых пикселей, но убрать то их не проблема)
2) Матрица изменения размера(При увеличении изображения будут артефакты как при повороте)
3) Матрица перемещения


Наверх

Титульная страница Поиск, карта сайта Написать письмо