Delphi Gebruikersgroep

 

Home    Up

Kleuren contrast in Delphi?

Via bitmap:=Tbitmap.create kan ik nu de kleuren van een bitmap aanpassen door de pixels een andere kleur te geven (D5-prof). 
(for i:=0 to bitmap.width-1 do 
for j:=0 to bitmap.height-1 do 
begin 
kleur:=colortorgb(bitmap.canvas.pixels[i,j]); 
r:=getrvalue(colortorgb(kleur)); 
g:=getgvalue(colortorgb(kleur)); 
b:=getbvalue(colortorgb(kleur)); 
{Kleuren aanpassen} 
canvas.pixels[i,j]:=rgb(r,g,b); 
end 
(Foto shop heeft een snellere methode maar deze is wel sneller dan werken met een image). 
1. Is er misschien een nog snellere methode binnen delphi? 
2. Hoe kan ik nu het contrast aanpassen? (Lijkt me zeer belangrijk bij kleur instellingen!). 
Wie kan/wil mij hierbij helpen? 
Ben

--

Ben, 

wellicht helpt de 'scanline' optie : 

procedure TForm1.Button1Click(Sender: TObject); 

// This example shows drawing directly to the BitMap 
var 
x,y : integer; 
BitMap : TBitMap; 
P : PByteArray; 
begin 
BitMap := TBitMap.create; 
try 
BitMap.LoadFromFile('C:\Program Files\Borland\Delphi 3\Images\Splash\256color\factory.bmp'); 
for y := 0 to BitMap.height -1 do 
begin 
P := BitMap.ScanLine[y]; 
for x := 0 to BitMap.width -1 do 
P[x] := y; 

end; 
canvas.draw(0,0,BitMap); 
finally 
BitMap.free; 
end; 
end; 

Hans 

--

Hans, 

Bedankt voor de reactie. 
Deze procedure tekent zeer snel de bitmap (wel met een witte dash-streep van links boven schuin naar beneden)
(for x:=0 to BitMap.with-1 P[x]:=y moet (dacht ik) zijn P[y]:=x), maar ik zie niet hoe ik hier mijn RGB wijziging
in kan verwerken. Heb je hier misschien nog een idee over? 

--

Ben, 

ik heb de code meen ik uit de help van Delphi 3 gekopierd, en verder niet naar de exacte code gekeken, dus daar kan
best wat mis gaan. 
Ik heb verder zelf nooit zo 'diep' gedoken in de kleurenafhandeling. Helaas heb ik ook nog niets in die richting gevonden. 
Kom ik nog wat tegen, dan laat ik het weten. 

Hans 

--

De ScanLine functie is inderdaad een stuk sneller. Je moet hier echter rekening houden met het aantal bbp. Als je een
24-bits bitmap hebt dan bestaat iedere pixel uit 3 bytes in een scanline(immers 3*8=24). Om dit duidelijk te maken het
volgende voorbeeld: 

Plaats een Button op een Form, probeer de volgende code maar eens: 

procedure TForm1.Button1Click(Sender: TObject); 
var 
B: TBitmap; 
x, y, w: Integer; 
P: PByteArray; 
begin 
B:=TBitmap.Create; 
try 
B.LoadFromFile('C:\WinNT\WinNT256.bmp'); // we lezen een plaatje in. 
B.PixelFormat := pf24bit; // we willen wel alle kleuren kunnen bewerken! 
w:=(B.Width * 3)-1; // breedte van plaatje zal toch niet wijzigen. 
for y := 0 to B.Height-1 do 
begin 
P:=B.ScanLine[y]; 
x:=0; 
while x begin 
P^[x]:=P^[x] and 255; // blauw aanpassen 
P^[x+1]:=P^[x+1] xor 255; // groen aanpassen 
P^[x+2]:=P^[x+2] or 255; // rood aanpassen 
inc(x, 3); 
end; 
end; 
finally 
Canvas.Draw(0,0,B); // we willen wel zien wat we gedaan hebben 
B.Free; // even opruimen 
end; 
end; 

Hopelijk heb je hier wat meer aan! 

--

Er zat helaas een foutje in de code, hierbij de verbeterde versie: 
procedure TForm1.Button1Click(Sender: TObject); 
var 
B: TBitmap; 
x, y, w: Integer; 
P: PByteArray; 
begin 
B:=TBitmap.Create; 
try 
B.LoadFromFile('C:\WinNT\WinNT256.bmp'); // we lezen een plaatje in. 
B.PixelFormat := pf24bit; // we willen wel alle kleuren kunnen bewerken! 
w:=(B.Width * 3)-1; // breedte van plaatje zal toch niet wijzigen. 
for y := 0 to B.Height-1 do 
begin 
P:=B.ScanLine[y]; 
x:=0; 
while x begin 
P^[x]:=P^[x] and 255; // blauw aanpassen 
P^[x+1]:=P^[x+1] xor 255; // groen aanpassen 
P^[x+2]:=P^[x+2] or 255; // rood aanpassen 
inc(x, 3); 
end; 
end; 
finally 
Canvas.Draw(0,0,B); // we willen wel zien wat we gedaan hebben 
B.Free; // even opruimen 
end; 
end; 

Veel suc6 

--

Hallo Anonymous, 

Alsnog bedankt voor je reactie op mijn kleuren probleempje (Ik was er nog niet uitgekomen). 
Aangezien ik echt nog geen ster ben, heb ik toch nog wat vragen. 
- Ik kon geen verschil ontdekken in de eerste en gecorrigeerde procedure en vroeg mij dus af wat de correctie was. 
- 'while x begin' moet waarschijnlijk zijn 'while x<=w begin' (of iets anders?). 
Zo niet wat is de functie van de variabele 'w' (deze wordt dan niet meer gebruikt) 
- Kleuren variatie krijg ik dan in mijn test door aanpassen van de waarden 255 (in jouw model) in het 'while-blok' 
- Ik heb echter de kleur beheersing nog niet in de hand, d.w.z. ik denk dus bv. : ik lees eerst oude kleur en
verhoog/verlaag de bestaande kleurwaarde. 
Is dit een juiste gedachtegang, zoja hoe moet ik dit verwerken in deze procedure? 
Je ziet dat ik het nog even niet op een rijtje kan krijgen. Zou je mij daarmee nog eens mee willen helpen? 
Groetjes Ben