• Опять я (15.09.12 20:11) [0]
    Нужна функция окрашивающая битмап в
    определенный цвет с
    настраиваемой интенсивностью от 0 до 255.
    Находил доки, но так и не понял как делать.
  • Опять я (17.09.12 05:44) [1]
    ап
  • MBo © (17.09.12 08:39) [2]
    TCanvas.FillRect
    а перед этим задать Brush.Color. А вот как именно - зависит от расшифровки фразы "определенный цвет с настраиваемой интенсивностью от 0 до 255."
    Один из вариантов: Color := RGB(100, 0, 0)
  • antonn © (17.09.12 12:14) [3]

    > MBo ©   (17.09.12 08:39) [2]

    он про то, чтобы битмап сделать аналогичным grayscale, но вместо белого там будет другой цвет. Ну и с градацией такого преобразования
  • Опять я (18.09.12 12:09) [4]

    > antonn ©   (17.09.12 12:14) [3]
    >
    >
    > > MBo ©   (17.09.12 08:39) [2]
    >
    > он про то, чтобы битмап сделать аналогичным grayscale, но
    > вместо белого там будет другой цвет. Ну и с градацией такого
    > преобразования


    В точку. :)
  • antonn © (04.10.12 23:25) [5]
    чет никто не пишет :)
    procedure bitmap_colorize(_B_in:Tbitmap; per:integer; color:Tcolor);
    const
     MaxPixelCountA = MaxInt div SizeOf(TRGBQuad);
    type
     PRGBAArray = ^TRGBAArray;
     TRGBAArray = array[0..MaxPixelCountA-1] of TRGBQuad;
    var x, y: Integer; _r,_b,_g:integer;
       w_in,h_in,w_out,h_out,tmp: Integer;
       RowIn:PRGBAArray;
       _d:double;
       r,g,b:byte;
    begin
     w_in:=_B_in.Width;
     h_in:=_B_in.Height;

     r:=GetRValue(color);
     g:=GetGValue(color);
     b:=GetBValue(color);

     for y:=0 to _B_in.Height-1 do begin
        RowIn:= _B_in.ScanLine[y];
       for x:=0 to _B_in.Width-1 do begin
            _d:=per/100;

            _r:= round( (RowIn[x].rgbRed*r/255)*(_d) + (RowIn[x].rgbRed)*(1-_d) );
            if _r>255 then _r:=255 else if _r<0 then _r:=0;

            _g:= round( (RowIn[x].rgbGreen*g/255)*(_d) + (RowIn[x].rgbGreen)*(1-_d) );
            if _g>255 then _g:=255 else if _g<0 then _g:=0;

            _b:= round( (RowIn[x].rgbBlue*b/255)*(_d) + (RowIn[x].rgbBlue)*(1-_d) );
            if _b>255 then _b:=255 else if _b<0 then _b:=0;

             RowIn[x].rgbRed:=_r;
             RowIn[x].rgbGreen:=_g;
             RowIn[x].rgbBlue:=_b;

     end; end;
    end;

  • Опять я (05.10.12 12:45) [6]

    > antonn ©   (04.10.12 23:25) [5]
    >
    > чет никто не пишет :)


    Чего ждал? :)
  • Джобер (08.10.12 22:10) [7]
    > antonn ©   (04.10.12 23:25) [5]

    Самое место для табличной оптимизации.
  • night_electric_night (30.10.12 21:05) [8]

    > Джобер   (08.10.12 22:10) [7]
    >
    > > antonn ©   (04.10.12 23:25) [5]
    >
    > Самое место для табличной оптимизации.
    >


    А что там оптимизировать таблицами?
  • Омлет © (31.10.12 14:35) [9]
    >  что там оптимизировать таблицами?

    Как-то так:

    procedure bitmap_colorize(_B_in:Tbitmap; per:integer; color:Tcolor);
    const
     MaxPixelCountA = MaxInt div SizeOf(TRGBQuad);
    type
     PRGBAArray = ^TRGBAArray;
     TRGBAArray = array[0..MaxPixelCountA-1] of TRGBQuad;

     function GetY(x: integer; comp: extended): byte;
     begin
       x := round(x*comp);
       if x > 255 then Result := 255
         else if x < 0 then Result := 0
         else Result := x;
     end;

    var x, y: Integer;
       RowIn: PRGBAArray;
       r, g, b: extended;
       tr, tg, tb: array[byte] of byte;
    begin
     r := (GetRValue(color)/255 - 1) * per/100 + 1;
     g := (GetGValue(color)/255 - 1) * per/100 + 1;
     b := (GetBValue(color)/255 - 1) * per/100 + 1;

     for x := low(byte) to high(byte) do
     begin
       tr[x] := GetY(x, r);
       tg[x] := GetY(x, g);
       tb[x] := GetY(x, b);
     end;

     for y:=0 to _B_in.Height-1 do begin
       RowIn:= _B_in.ScanLine[y];
       for x:=0 to _B_in.Width-1 do begin
         with RowIn[x] do begin
           rgbBlue := tb[rgbBlue];
           rgbGreen := tg[rgbGreen];
           rgbRed := tr[rgbRed];
         end;
       end;
     end;
    end;

Есть новые Нет новых   [134427   +37][b:0][p:0.002]