Уменьшение изображения

  • Автор темы Pavelbej
  • Дата начала
Статус
Закрыто для дальнейших ответов.
P

Pavelbej

Гость
#1
Имеется картинка, например 1024x768 или 800x600. Как можно ее качественно уменьшить до примерно 100x100 пикселей? Помогите, очень надо. Нашел один вариант но там идет считывание каждого пикселя по стпрока, потом подсчет общего цвета четырех соседних пикселей, короче медленно работает. Буду очень рад вашей помощи.
 
D

DZX

Гость
#2
Возьми два TPicture, залей в один свое изображение и прорисуй в канве второго его с масштабированием. Не знаю как с качеством, но это самый простой и быстрый способ. Если надо пример можно поискать в инете или я могу покопаться в своих исходниках делал я давно такую бороду.
 
B

Barmutik

Гость
#3
Как вариант .. достаточно приемлимое качество после сжатия...

Код:
procedure CompressImageSpecifiedSize(Bmp: Graphics.TBitmap; AWidth, AHeight: Integer;
APixelFormat: TPixelFormat);
var
TempBmp: Graphics.TBitmap;
AX: Real;
AY: Real;
Compress: Real;
begin
{$ifdef ControlStack}
try
{$endif ControlStack}
TempBmp := Graphics.TBitmap.Create;
TempBmp.PixelFormat := APixelFormat;
TempBmp.Canvas.Lock;
AX := Bmp.Width / AWidth;
AY := Bmp.Height / AHeight;
if AX > AY then
 Compress := AX
else
 Compress := AY;
if Compress > 1 then
begin
 TempBmp.Width := Max(1, Round(Bmp.Width / Compress));
 TempBmp.Height := Max(1, Round(Bmp.Height / Compress));
end
else
begin
 TempBmp.Width := Bmp.Width;
 TempBmp.Height := Bmp.Height;
end;
SetStretchBltMode(TempBmp.Canvas.Handle, HALFTONE);
SetBrushOrgEx(TempBmp.Canvas.Handle, 0, 0, nil);
StretchBlt(TempBmp.Canvas.Handle, 0, 0, TempBmp.Width, TempBmp.Height,
 Bmp.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height, SRCCOPY);
Bmp.Width := TempBmp.Width;
Bmp.Height := TempBmp.Height;
Bmp.Canvas.Draw(0, 0, TempBmp);
Bmp.PixelFormat := APixelFormat;
TempBmp.Canvas.Lock;
TempBmp.Free;
{$ifdef ControlStack}
except
 on E: Exception do
 begin
  ReRaiseException(E, 1547);
  raise;
 end;
end;
{$endif ControlStack}
end;
 
P

Pavelbej

Гость
#4
Наверное я не правильно изложил проблему. Мне нужно сделать предварительный просмотр.
 
D

DZX

Гость
#5
Ну и чего тогда мучаться ложишь на форму объект изображение, ставишь размер
нужный, выключаешь авторазмер, растягивание выставляешь и грузи и смотри.
 
B

Barmutik

Гость
#6
Ну так и чем приведённая функция не подходит ?
 
G

Guest

Гость
#7
Пример реализации уменьшения изображений в четыре раза: http://www.defder.nm.ru/download/Downsampler.exe

Можно посмотреть исходник декомпилятором NET Reflector, например.

Но тут упор делается на качество.
 
Статус
Закрыто для дальнейших ответов.