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ą???
Dodam tylko że jest biblioteka graphics32 https://sourceforge.net/projects/graphics32/ która znacznie przyspiesza takie operacje.
sory ale nie mogę tego zainstalować mimo instalacji package ciągle wywala że nie ma jakiegoś image
@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.
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 !
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.
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.
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;
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;
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.