• 🔥 Бесплатный курс от Академии Кодебай: «Анализ защищенности веб-приложений»

    🛡 Научитесь находить и использовать уязвимости веб-приложений.
    🧠 Изучите SQLi, XSS, CSRF, IDOR и другие типовые атаки на практике.
    🧪 Погрузитесь в реальные лаборатории и взломайте свой первый сайт!
    🚀 Подходит новичкам — никаких сложных предварительных знаний не требуется.

    Доступ открыт прямо сейчас Записаться бесплатно

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

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

Pavelbej

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

Код:
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;
 
Наверное я не правильно изложил проблему. Мне нужно сделать предварительный просмотр.
 
Ну и чего тогда мучаться ложишь на форму объект изображение, ставишь размер
нужный, выключаешь авторазмер, растягивание выставляешь и грузи и смотри.
 
Ну так и чем приведённая функция не подходит ?
 
Пример реализации уменьшения изображений в четыре раза:

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

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

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab