Jak za pomocą funkcji delphi płynnie rozjaśniać i przyciemniać bitmapę?

0

witajcie moi drodzy szukałem w google ale nie znalazłem nic działającego, macie może jakieś funkcje które przyciemniają obraz i rozjaśniają???

0

Dodam tylko że jest biblioteka graphics32 https://sourceforge.net/projects/graphics32/ która znacznie przyspiesza takie operacje.

0

sory ale nie mogę tego zainstalować mimo instalacji package ciągle wywala że nie ma jakiegoś image

3

@nosferatu_ niezmiernie nam przykro z tego powodu zwłaszcza że wiemy co to za "jakieś image" i o jaką wersję Delphi chodzi poza tym tam jest po 2 plik .dpk dla danej wersji Delphi i trzeba instalować w odpowiedniej kolejności (jak się domyślam te z DSGN w nazwie jako drugie) a po instalacji (albo nawet jeszcze przed) jak zwykle dodać ścieżki w ustawieniach.

0

na poczatek zacznij od takiej wersji

var
  B1,B2: TBitamp;
begin
  B1:=TBitamp.create;
  B2:=TBitamp.create;

  B1.loadfromfile(1.bmp)
  B2.loadfromfile(1.bmp);// obie maja taki sam rozmiar 


  for y:= 0 to b1.height -1 do 
    for x := 0 to b1.width -1 do 
    begin
      b2.canvas.pixels[x,y] :=  b1.canvas.pixels[x,y] div 3 // przepisuje dane ale z dzieleniem na 3
    end;

  b2.savetofile(out.bmp);
  b1.fre;
  b2.free;
end;

A potem to udoskonalaj !

0
nosferatu_ napisał(a):

witajcie moi drodzy szukałem w google ale nie znalazłem nic działającego, macie może jakieś funkcje które przyciemniają obraz i rozjaśniają???

Musiałbyś chyba przekodować obraz z RGB na HLS, i teraz podnieść L,
no i odwrócić to z powrotem do RGB.

może lepiej użyć: YCbCr; to taki skecz z obrazków jpeg:
http://pl.wikipedia.org/wiki/YCbCr

tu Y zwiększasz.

Jest też tzw. współczynnik gamma - coś tam z temperaturą... chyba można tym pomanipulować w celu rozjaśnienia.

0

Musiałbyś chyba przekodować obraz z RGB na HLS, i teraz podnieść L,
no i odwrócić to z powrotem do RGB.

A po co? Rozjaśnianie i przyciemnianie można bez problemu wykonać bezpośrednio na składowych RGB; @kAzek podlinkował artykuł, w którym podane są bardzo proste kody, realizujące rozjaśnianie i przyciemnianie; Więcej nie ma co drążyć tego tematu.

0

To tak nie działa, niestety.

Jasność, czyli czułość oka, zależy od koloru,
i np. banalna konwersja rgb -> szare wygląda jakoś tak:

szary = r0.3 + g0.6 + b*0.1;
a nie tak:
szary = (r + g + b) / 3;

2

To tak nie działa, niestety.

Oczywiście że działa, trzeba tylko umieć tego użyć; A żeby udowodnić Ci, że podane w tym artykule przykładowe kody działają prawidłowo, wykonałem w Lazarusie testowy program - bitl.zip

Zastosowałem w nim kody z wymienionego artykułu, ale lekko poprawione, bo nazewnictwo nie podobało mi się:

function TMainForm.ByteRange(AInteger: Integer): Byte;
begin
  Result := Min(Max(AInteger, 0), 255);
end;

procedure TMainForm.MakeLighter(ABitmap: TBitmap; AAmount: Integer);
var
  pintComp: PByte;
  intCol, intRow: Integer;
begin
  for intRow := 0 to ABitmap.Height - 1 do
  begin
    pintComp := ABitmap.{%H-}ScanLine[intRow];

    for intCol := 0 to ABitmap.Width * 3 - 1 do
    begin
      pintComp^ := ByteRange(pintComp^ + ((255 - pintComp^) * AAmount) div 255);
      Inc(pintComp);
    end;
  end;
end;

procedure TMainForm.MakeDarker(ABitmap: TBitmap; AAmount: Integer);
var
  pintComp: PByte;
  intCol, intRow: Integer;
begin
  for intRow := 0 to ABitmap.Height - 1 do
  begin
    pintComp := ABitmap.{%H-}ScanLine[intRow];

    for intCol := 0 to ABitmap.Width * 3 - 1 do
    begin
      pintComp^ := ByteRange(pintComp^ - (pintComp^ * AAmount) div 255);
      Inc(pintComp);
    end;
  end;
end;

Efekt poniżej - i co, nie da się zmienić jasności? Oczywiście że się da, jadąc piksel po pikselu, składowa po składowej;

bitl.png

i np. banalna konwersja rgb -> szare wygląda jakoś tak:

szary = r0.3 + g0.6 + b*0.1;
a nie tak:
szary = (r + g + b) / 3;

Jak już podajesz rozwiązanie czy przykład to nie "jakoś tak", tylko "dokładnie tak";

Sam używam funkcji, która w pierwszym kroku przerabia kolor na skalę szarości, a w drugim zmienia jasność:

function ColorToGrayShade(AColor: TColor): TColor;
var
  intR, intG, intB, intGrayShade, intPercent: UInt8;
begin
  intR := AColor and $FF;
  intG := AColor shr $08;
  intB := AColor shr $10;

  intPercent := INTERFACE_PERCENT_GRAY_SHADE;  // czyli 50

  intGrayShade := Round((0.299 * intR) + (0.587 * intG) + (0.114 * intB));
  intGrayShade := Trunc(intGrayShade * (100 - intPercent) / 100) + Round(255 - (100 - intPercent) / 100 * 255);

  Result := RGBToColor(intGrayShade, intGrayShade, intGrayShade);
end;

I znów cuda jaja - kod działa prawidłowo.

1 użytkowników online, w tym zalogowanych: 0, gości: 1