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

Тема в разделе "Delphi - Multimedia, Графика, Игры", создана пользователем Pavelbej, 8 фев 2006.

Статус темы:
Закрыта.
  1. Pavelbej

    Pavelbej Гость

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

    DZX Гость

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

    Barmutik Гость

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

    Код (Text):
    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;
     
  4. Pavelbej

    Pavelbej Гость

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

    DZX Гость

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

    Barmutik Гость

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

    Guest Гость

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

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

    Но тут упор делается на качество.
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей