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

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

Сжатие картинки [D5, XP]


vitaliy14 ©   (2005-12-13 14:25:00) 

Здравствуйте! Мне необходимо изображение TBitmap размеров (heigth, width).
сжать до размеров (heigth/4, width/4). То есть по-русски говоря, исходную картинку уменьшить картинку в четыре раза (по масштабу)!

Кто-нибудь может, пожалуйста, выложить аналогичный пример (или подробный алгоритм, если примера нет) уменьшения картинки?

зы просто задача может и банальная, но на дельфи начал писать недавно и сроки поджимают, поэтому самому изобретать по новому велосипед нет времени!  Заранее спасибо


Antonn   (2005-12-13 16:15:00) [1]

vitaliy14   (13.12.05 14:41) [2]
так чтобы не допустить ее искажения или потери информации)


> сжать до размеров (heigth/4, width/4).

как то не стыкуется...

procedure Small4x(Bitmap:Tbitmap);
const
 PixelsCount = MaxInt div SizeOf(TRGBTriple);
type
 PRGBArray = ^TRGBArray;
 TRGBArray = array[0..PixelsCount-1] of TRGBTriple;
var i,x,y,cx,cy,cxi,DestR,DestG,DestB:Integer;
 Row1,Row2,Row3,Row4,DestRow:PRGBArray;
 _tmpBitmap:Tbitmap;
begin
 _tmpBitmap:=Tbitmap.Create;
 try
 _tmpBitmap.Width:=Bitmap.Width;
 _tmpBitmap.Height:=Bitmap.Height;
 BitBlt(_tmpBitmap.Canvas.Handle,0,0,_tmpBitmap.Width,_tmpBitmap.Height,Bitmap.Canvas.Handle,0,0,SRCCOPY);
 _tmpBitmap.PixelFormat:=pf24bit;
 Bitmap.PixelFormat:=pf24bit;
 Bitmap.Width:=Bitmap.Width div 4;
 Bitmap.Height:=Bitmap.Height div 4;

 Row2:=nil; Row3:=nil; Row4:=nil;
 for y:=0 to Bitmap.Height-1 do begin
   cy:=y*4;
   Row1:=_tmpBitmap.ScanLine[cy];
   Row2:=_tmpBitmap.ScanLine[cy+1];
   Row3:=_tmpBitmap.ScanLine[cy+2];
   Row4:=_tmpBitmap.ScanLine[cy+3];
   DestRow := Bitmap.ScanLine[y];
   for x:=0 to Bitmap.Width - 1 do begin
     cx:=x*4;
     DestR:=0; DestG:=0; DestB:=0;
       for i:=0 to 3 do begin
         cxi:=cx+i;
         DestR:=DestR + Row1[cxi].rgbtRed + Row2[cxi].rgbtRed + Row3[cxi].rgbtRed + Row4[cxi].rgbtRed;
         DestG:=DestG + Row1[cxi].rgbtGreen + Row2[cxi].rgbtGreen + Row3[cxi].rgbtGreen + Row4[cxi].rgbtGreen;
         DestB:=DestB + Row1[cxi].rgbtBlue + Row2[cxi].rgbtBlue + Row3[cxi].rgbtBlue + Row4[cxi].rgbtBlue;
       end;
       DestRow[x].rgbtRed:=DestR div 16;
       DestRow[x].rgbtGreen:=DestG div 16;
       DestRow[x].rgbtBlue:=DestB div 16;
   end;
 end
 finally
  _tmpBitmap.Free;
 end;
end;
(с) antonn


vitaliy14   (2005-12-13 14:41:00) [2]


> св-во Stretch


есть пример какой? а картинка не будет искажаться?

зы я просто читал, что  Stretch больше подходит для каких-то узоров, а мне нужно работатать с фотографией(так чтобы не допустить ее искажения или потери информации)


clickmaker   (2005-12-13 14:29:00) [3]

св-во Stretch


Наверх

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