Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Изменить размер Bitmap

Delphi , Графика и Игры , Bitmap

Изменить размер Bitmap

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

{ 
This function resizes a bitmap calculating the average color of a rectangular 
area of pixels from source bitmap to a pixel or a rectangular area to target 
bitmap. 

It produces a soft-color and undistorsioned result image unlike the StretchDraw 
method 

I think that this method have a tenichal name, but I am not sure. 

As you can see, this function could be very optimized :p 
}

 procedure TFormConvertir.ResizeBitmap(imgo, imgd: TBitmap; nw, nh: Integer);
 var
   xini, xfi, yini, yfi, saltx, salty: single;
   x, y, px, py, tpix: integer;
   PixelColor: TColor;
   r, g, b: longint;

   function MyRound(const X: Double): Integer;
   begin
     Result := Trunc(x);
     if Frac(x) >= 0.5 then
       if x >= 0 then Result := Result + 1
       else
         Result := Result - 1;
     // Result := Trunc(X + (-2 * Ord(X < 0) + 1) * 0.5); 
  end;

 begin
   // Set target size 

  imgd.Width  := nw;
   imgd.Height := nh;

   // Calcs width & height of every area of pixels of the source bitmap 

  saltx := imgo.Width / nw;
   salty := imgo.Height / nh;


   yfi := 0;
   for y := 0 to nh - 1 do
   begin
     // Set the initial and final Y coordinate of a pixel area 

    yini := yfi;
     yfi  := yini + salty;
     if yfi >= imgo.Height then yfi := imgo.Height - 1;

     xfi := 0;
     for x := 0 to nw - 1 do
     begin
       // Set the inital and final X coordinate of a pixel area 

      xini := xfi;
       xfi  := xini + saltx;
       if xfi >= imgo.Width then xfi := imgo.Width - 1;


       // This loop calcs del average result color of a pixel area 
      // of the imaginary grid 

      r := 0;
       g := 0;
       b := 0;
       tpix := 0;

       for py := MyRound(yini) to MyRound(yfi) do
       begin
         for px := MyRound(xini) to MyRound(xfi) do
         begin
           Inc(tpix);
           PixelColor := ColorToRGB(imgo.Canvas.Pixels[px, py]);
           r := r + GetRValue(PixelColor);
           g := g + GetGValue(PixelColor);
           b := b + GetBValue(PixelColor);
         end;
       end;

       // Draws the result pixel 

      imgd.Canvas.Pixels[x, y] :=
         rgb(MyRound(r / tpix),
         MyRound(g / tpix),
         MyRound(b / tpix)
         );
     end;
   end;
 end;

Привет! Я переведу текст на русский язык:

Это фрагмент кода Delphi, который использует алгоритм среднего значения для изменения размера изображения битмапы с целью получения мягкого цвета и без искажений. Функция ResizeBitmap принимает четыре параметра: два объекта TBitmap (imgo и imgd) - источник и целевое изображения, соответственно, а также два целых числа (nw и nh) - новые ширина и высота целевого изображения.

Вот разбивка кода:

  1. Первая секция настраивает целевое изображение с указанной шириной и высотой.
  2. Она вычисляет коэффициенты масштабирования для осей x и y, деля размеры источника битмапы на размеры целевого изображения.

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

Для каждого пикселя в целевом изображении:

  • Он устанавливает начальную и конечную координаты x и y для области пикселей, которые нужно среднестатистически.
  • Он вычисляет средний цвет для этой области, проходимся через каждый пиксель в области, преобразуя его в RGB-значения, и суммирует красные, зеленые и синие компоненты. Функция MyRound используется для округления результата до ближайшего целого.
  • Наконец, он устанавливает соответствующий пиксель в целевом изображении средним цветом.

Код использует несколько функций:

  1. ColorToRGB: преобразует значение TColor (специфическое для Delphi) в RGB-значения.
  2. GetRValue, GetGValue и GetBValue: извлекают красные, зеленые и синие компоненты из RGB-значения соответственно.
  3. MyRound: округляет вещественное число до ближайшего целого.

Код оптимизирован использованием одиночной цикла для каждого пикселя в целевом изображении, а не проходимся через каждый пиксель в источнике битмапы отдельно. Это уменьшает общую вычислительную нагрузку и использование памяти.

Автор отмечает, что данный алгоритм производит мягкий цвет и без искажений, что часто желательно при изменении размера изображений. Однако он может не быть подходящим для всех случаев использования, таких как высокоскоростное обрабатывание или точная цветовая точность.

Некоторые потенциальные улучшения для рассмотрения:

  1. Добавьте обработку ошибок: код предполагает, что входные битмапы являются валидными и имеют правильные размеры. Добавление проверок для недопустимых вводов может улучшить устойчивость.
  2. Оптимизируйте использование памяти: используя одиночный цикл и хранение временных результатов в переменных, код уменьшает аллокацию памяти и копирование. Однако возможно еще можно оптимизировать, используя существующие ресурсы памяти или уменьшая количество временных переменных.
  3. Рассмотрите альтернативные алгоритмы: хотя данный алгоритм производит хорошие результаты для многих случаев использования, есть другие техники, которые могут быть более подходящими для конкретных приложений (например, билинейное интерполирование, кубическое интерполирование или ближайшее соседство).

Функция ResizeBitmap изменяет размер битмапа, рассчитывая среднее значение цвета прямоугольной области пикселей из исходного битмапа в пиксел или прямоугольную область целевого битмапа.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Bitmap ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-28 05:41:54/0.0036749839782715/0