• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

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

Pavelbej

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

DZX

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

Barmutik

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

Код:
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

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

DZX

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

Barmutik

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

Guest

Пример реализации уменьшения изображений в четыре раза:

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

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!