Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.01.2013, 20:46   #1
hon
Форумчанин
 
Регистрация: 08.06.2011
Сообщений: 693
По умолчанию Как модифицировать PNGImage

Возникла такая проблема:
Я загружаю картинку в формате PNG в Image. Все работает. Но мне нужно с картинкой проводить две функции:
  1. Увеличение/уменьшение яркости
  2. Поворот на 90 градусов

Проблема в обращении с изображением. Пробовал такой код для повышения яркости на 51/255:
Код:
var
   x,y:smallint;
   r,g,b:byte;
.....
for y:=0 to Image1.Height do
    for x:=0 to Image1.Width do
         begin
         r:=GetRValue(Image1.Canvas.Pixels[x,y]);
         g:=GetGValue(Image1.Canvas.Pixels[x,y]);
         b:=GetBValue(Image1.Canvas.Pixels[x,y]);
         r:=r+51; g:=g+51; b:=b+51;
         if r>255 then r:=255;
         if g>255 then g:=255;
         if b>255 then b:=255;
         Image1.Canvas.Pixels[x,y]:=RGB(r,g,b);
         end;
Но выдает ошибку:
Цитата:
Project Project1.exe raised exception class EInvalidOperation with message 'Can only modify an image if it contains a bitmap'. Process stopped. Use Step or Run to continue.
Так как модифицировать PNG? И как повернуть его на 90 градусов с учетом прозрачности?
hon вне форума Ответить с цитированием
Старый 08.01.2013, 22:43   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Изменение цвета таким образом у меня работает:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  x, y: smallint;
  Px: PRGBTriple;
  png: TPngImage;
begin
  png := TPngImage.Create;
  png.Assign(Image1.Picture.Graphic);
  with png do
    for y := 0 to Height - 1 do
    begin
      Px := ScanLine[y];
      for x := 0 to Width - 1 do
      begin
        inc(Px.rgbtRed, 51);
        inc(Px.rgbtGreen, 51);
        inc(Px.rgbtBlue, 51);
        inc(Px);
      end;
    end;
  Image1.Picture.Assign(png);
  png.Free;
end;
Нужно учитывать, что inc(Px.rgbtRed, 51); вызывает переполнение типа - картинка меняет свой цвет циклически при нескольких нажатиях кнопки.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 09.01.2013 в 19:23.
BDA на форуме Ответить с цитированием
Старый 08.01.2013, 22:59   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Как-то в этом духе, только это не совсем изменение яркости. Можно попробовать ColorRGBToHLS и ColorHLSToRGB подключить из GraphUtil и поиграться с Luminance
Код:
procedure TForm1.Button1Click(Sender: TObject);
var xPng: TPngObject;
    x,y:smallint;
    r,g,b: Word;
    xColor: TColor;
begin
  xPng:=TPngObject.Create;
  xPng.LoadFromFile('e:\w7lxe.png');
  Image1.AutoSize:=True;
  Image1.Picture.Bitmap.Height:=xPng.Height;
  Image1.Picture.Bitmap.Width:=xPng.Width;
  for x:=0 to xPng.Height-1 do
    for y:=0 to xPng.Width-1 do begin
      xColor:=xPng.Pixels[x,y];
      r:=GetRValue(xColor);
      g:=GetGValue(xColor);
      b:=GetBValue(xColor);
      r:=r+51; g:=g+51; b:=b+51;
      if r>255 then r:=255;
      if g>255 then g:=255;
      if b>255 then b:=255;
      Image1.Canvas.Pixels[x,y]:=RGB(r,g,b);
    end;
  xPng.Free;
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как модифицировать меню? invertor Общие вопросы C/C++ 5 08.01.2013 20:47
C++,try-catch-trow,Как модифицировать готовый код? Aleksandr_Yanov Помощь студентам 0 21.08.2010 15:39
Конвертер pngimage в числовую матрицу Rezet Общие вопросы Delphi 3 15.11.2009 19:24
Написал программу, помогите натянуть Шейдеры или как нибудь модифицировать программу WMLite Паскаль, Turbo Pascal, PascalABC.NET 0 16.06.2009 13:57
PngImage Fantom Компоненты Delphi 8 01.08.2008 16:48