Хорошо! Хорошо!:  0
Плохо! Плохо!:  0
Показано с 1 по 2 из 2

Тема: Bitmap

  1. #1

    По умолчанию Bitmap

    Код:
    #===============================================================================
    # Bitmap
    # Класс, отвечающий за рисунок. Рисунки - своеобразное выражение графики.
    #===============================================================================
    class Bitmap
      #-----------------------------------------------------------------------------
      # Очищает заданный участок изображения путем заливки его прозрачностью
      # params:
      # x, y, width, height :integer - параметры очищаемой области
      # или
      # rect : rect - очищаемая область
      #-----------------------------------------------------------------------------
      def clear_rect(*params)
        params.push(Color.new(0, 0, 0, 0))
        self.fill_rect(*params)
      end
      #-----------------------------------------------------------------------------
      # Заливает указанную область градиентом
      # x, y, width, height :integer - параметры заливаемой области
      # color1    :color - начальный цвет градиента
      # color2    :color - конечный цвет градиента
      # vertical  :bool  - если true - вертикальная заливка, иначе - горизонтальная
      #-----------------------------------------------------------------------------
      def gradient_fill_rect(x, y, width, height, color1, color2, vertical = false)
        self.gradient_fill_rect(Rect.new(x, y, width, height), color1, color2, vertical = false)
      end
      #-----------------------------------------------------------------------------
      # Заливает указанную область градиентом
      # rect      :rect  - заливаемая область
      # color1    :color - начальный цвет градиента
      # color2    :color - конечный цвет градиента
      # vertical  :bool  - если true - вертикальная заливка, иначе - горизонтальная
      #-----------------------------------------------------------------------------
      def gradient_fill_rect(rect, color1, color2, vertical = false)
        if color2 == color1
          self.fill_rect(rect, color1)
        else
          distance = vertical ? rect.height : rect.width
          for i in 0...distance
            # Graphics.update # Следить
            r = color1.red   * (distance-1-i)/(distance-1) + color2.red   * i/(distance-1)
            g = color1.green * (distance-1-i)/(distance-1) + color2.green * i/(distance-1)
            b = color1.blue  * (distance-1-i)/(distance-1) + color2.blue  * i/(distance-1)
            a = color1.alpha * (distance-1-i)/(distance-1) + color2.alpha * i/(distance-1)
            self.fill_rect(vertical ? rect.x : rect.x + i,
                           vertical ? rect.y + i : rect.y,
                           vertical ? rect.width : 1,
                           vertical ? 1 : rect.height,
                           Color.new(r, g, b, a)) 
          end
        end
      end
    end
    Последний раз редактировалось Equilibrium Keeper; 30.07.2011 в 21:19.

  2. #2

    По умолчанию

    Все 4 метода - реализация оных из VX.

    На рассмотрение предлагаю следующие:
    Код:
    #----------------------------------------------------------------------------
      # Возвращает отраженное изображение
      # Возвращает :bitmap
      # horizontal :boolean - изображение будет отражено по горизонтали
      # vertical   :boolean - изображение будет отражено по вертикали
      #----------------------------------------------------------------------------
      def mirror (horizontal = true, vertical = false)
        source = self
        if horizontal
          bitmap = Bitmap.new(source.width, source.height)
          for i in 0...source.width
            bitmap.blt(i, 0, source, Rect.new(source.width - 1 - i, 0, 1, source.height))
          end
          source = bitmap
        end
        if vertical
          bitmap = Bitmap.new(source.width, source.height)
          for i in 0...source.height
            bitmap.blt(0, i, source, Rect.new(0, source.height - 1 - i, source.width, 1))
          end
          source = bitmap
        end
        return source
      end
      #----------------------------------------------------------------------------
      # Изменяет размер изображения
      # Возвращает :bitmap
      # width      :integer {1~+x) - итоговая ширина изображения
      # height     :integer {1~+x) - итоговая высота изображения
      # stretch    :boolean - будет ли исходное изображение растянуто или сжато
      # background :color   - цвет фона  
      #----------------------------------------------------------------------------
      def resize (width, height, stretch = true, background = nil)
        bitmap = Bitmap.new(width, height)
        bitmap.font = self.font
        if stretch
          bitmap.stretch_blt(Rect.new(0, 0, width, height), self, self.rect)
        else
          bitmap.fill_rect(0, 0, width, height, background) if background
          bitmap.blt(0, 0, self, Rect.new(0, 0, self.width, self.height))
        end
        return bitmap
      end
      #-----------------------------------------------------------------------------

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •