Главная страница
    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.46 MB
Время: 0.034 c
2-1182787203
mry
2007-06-25 20:00
2007.07.22
array of Byte


4-1171368306
DVM
2007-02-13 15:05
2007.07.22
CloseHandle вызывает исключения?


1-1179320420
Alexys
2007-05-16 17:00
2007.07.22
списки


1-1179300822
Кирилл_А
2007-05-16 11:33
2007.07.22
Шрифт


2-1182875295
next22
2007-06-26 20:28
2007.07.22
TEdit..TButton и TImage





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский