![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сжатие картинки [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);(с) antonn
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;
vitaliy14 (2005-12-13 14:41:00) [2]
> св-во Stretch
есть пример какой? а картинка не будет искажаться?
зы я просто читал, что Stretch больше подходит для каких-то узоров, а мне нужно работатать с фотографией(так чтобы не допустить ее искажения или потери информации)
clickmaker (2005-12-13 14:29:00) [3]св-во Stretch