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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.03.2012, 04:10   #1
Denager
Москоу
Форумчанин
 
Регистрация: 29.01.2008
Сообщений: 138
По умолчанию PNG: HUE

Доброе время суток!
Имею обработчик нажатия на картинку PNG
Код:
function SetRGBChannelValue( Bitmap: TBitmap; Red, Green, Blue: Integer ): boolean;
var
  i, j: Integer;
  rgbc: array[0..2] of Byte;
  c: TColor;
  r, g, b: Byte;
begin
   if ( Red = 0 ) and ( Green = 0 ) and ( Blue = 0 ) then
   begin
      Result := false;
      Exit;
   end;
 
   for i := 0 to Bitmap.Height do
   begin
      for j := 0 to Bitmap.Width do
      begin
         c := Bitmap.Canvas.Pixels[j, i];
         rgbc[0] := GetRValue(c);
         rgbc[1] := GetGValue(c);
         rgbc[2] := GetBValue(c);
 
         if not ( rgbc[0] + Red < 0 ) and not ( rgbc[0] + Red > 255 ) then
            rgbc[0] := rgbc[0] + Red;
         if not ( rgbc[1] + Green < 0 ) and not ( rgbc[1] + Green > 255 ) then
            rgbc[1] := rgbc[1] + Green;
         if not ( rgbc[2] + Blue < 0 ) and not ( rgbc[2] + Blue > 255 ) then
            rgbc[2] := rgbc[2] + Blue;
         r := rgbc[0];
         g := rgbc[1];
         b := rgbc[2];
         Bitmap.Canvas.Pixels[j, i] := RGB( r, g, b );
      end;
   end;
   Result := true;
end;
..
const
  TRANSPARENT_COLOR=clGray;
var
  png : TPNGObject;
  btm: Graphics.TBitmap;
begin
  png := TPNGObject.Create;
  png.LoadFromFile(Sample.png');
  btm :=  TBitmap.Create;
  btm.SetSize(png.Width, png.Height + 1);
  btm.Canvas.Brush.Style := bsClear;
  btm.Canvas.Brush.Color := TRANSPARENT_COLOR;
  btm.Canvas.FillRect(btm.Canvas.ClipRect);
  btm.Canvas.Draw(0,0, png);
  SetRGBChannelValue(btm,103,209,136);
  image1.Picture.Assign(btm);
  FreeAndNil(png);
  FreeAndNil(btm);
Вроде получаю, что надо оттенок PNG меняется, но эксперименты с константой прозрачности ввели в заблуждение.. Меняются только некоторые цвета..
Вообщем, приклеплю пример PNG рисунка, необходимо чтобы менялись все цвета всего рисунка, оставаясь с неизменным прозрачным фоном.
то есть, как в фотошопе, hue/saturation необходимо реализовать, учитывая прозрачность PNG.
Спасибо!
Изображения
Тип файла: png 1.png (7.0 Кб, 77 просмотров)
Тип файла: jpg 2.jpg (19.8 Кб, 128 просмотров)
Denager вне форума Ответить с цитированием
Старый 15.03.2012, 10:07   #2
x128
Форумчанин
 
Регистрация: 03.02.2010
Сообщений: 178
По умолчанию

Ты зачем-то приплел туда битмап в который альфа не копируется стандартными средствами, да и если бы и копировалась, имидж это дело не отображает. Обрабатывай PNG напрямую, там есть доступ и к канве и пикселам и имидж его правильно отображает. Доступ к пикселам лучше организовать через Scanline, так будет значительно быстрее.
x128 вне форума Ответить с цитированием
Старый 15.03.2012, 16:15   #3
Denager
Москоу
Форумчанин
 
Регистрация: 29.01.2008
Сообщений: 138
По умолчанию

Сделал вот так:
Код:
procedure Tform1.hue(CurrImage: TImage; load_pic:String; hue_color: TColor);
var
  png : TPNGObject;
  Y,X:integer;
begin
  png := TPNGObject.Create;
  png.LoadFromFile(load_pic);
  for y:=0 to png.Height-1 do
    for x:=0 to png.Width-1 do
      png.Pixels[x,y]:=hue_color;
  CurrImage.Picture.Assign(png);
  FreeAndNil(png);
end;
Код:
hue(image1,'picture.png',ClRed)
Image теперь полностью окрашивается в указанный цвет. Немного не то, что хотелось
Denager вне форума Ответить с цитированием
Старый 16.03.2012, 15:24   #4
x128
Форумчанин
 
Регистрация: 03.02.2010
Сообщений: 178
По умолчанию

Так у тебя все пикселы заменяются на hue_color!? Читай пиксел - делай требуемое преобразование - записывай измененный пиксел.
x128 вне форума Ответить с цитированием
Старый 17.03.2012, 02:57   #5
Denager
Москоу
Форумчанин
 
Регистрация: 29.01.2008
Сообщений: 138
По умолчанию

Спасибо! Нашел функцию, очень часто встречаюущуюся modcolors.
Код:
procedure ModColors(Bitmap: TBitmap; Color: TColor);
  function GetR(const Color: TColor): Byte;
    //извлечение красного
  begin
    Result := Lo(Color);
  end;
  function GetG(const Color: TColor): Byte;
    //извлечение зелёного
  begin
    Result := Lo(Color shr 8);
  end;
  function GetB(const Color: TColor): Byte;
    //извлечение синего
  begin
    Result := Lo((Color shr 8) shr 8);
  end;

  function BLimit(B: Integer): Byte;
  begin
    if B < 0 then
      Result := 0
    else if B > 255 then
      Result := 255
    else
      Result := B;
  end;

type
  TRGB = record
    B, G, R: Byte;
  end;
  pRGB = ^TRGB;
var
  r1, g1, b1: Byte;
  x, y: Integer;
  Dest: pRGB;
  A: Double;
begin
  Bitmap.PixelFormat := pf24Bit;
  r1 := Round(255 / 100 * GetR(Color));
  g1 := Round(255 / 100 * GetG(Color));
  b1 := Round(255 / 100 * GetB(Color));
  for y := 0 to Bitmap.Height - 1 do
  begin
    Dest := Bitmap.ScanLine[y];
    for x := 0 to Bitmap.Width - 1 do
    begin
      with Dest^ do
      begin
        A := (r + b + g) / 300;
        with Dest^ do
        begin
          R := BLimit(Round(r1 * A));
          G := BLimit(Round(g1 * A));
          B := BLimit(Round(b1 * A));
        end;
      end;
      Inc(Dest);
    end;
  end;
end;
Изменил под PNG и все работает как необходимо!
Спасибо еще раз
Denager вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
PNG nXs Мультимедиа в Delphi 2 31.10.2010 12:53
PNG _-Re@l-_ Общие вопросы Delphi 8 15.07.2010 16:48
Ковертирование из png 24 бит в png 8 бит isat Общие вопросы .NET 0 22.03.2010 13:38
*.png Killbrum Помощь студентам 3 30.08.2008 15:51
Png Witaliy Мультимедиа в Delphi 3 25.05.2008 23:10