hallo

ik ben bezig een javascript te schijven dat de sepia tint van een kleur kan berekenen.
grijs is makkelijk, namelijk
color = ((R + G + B) / 3);

maar hoe gaat dit voor sepia?

ik heb nu iets van
return 'rgb(' + ((color + 25) < 255 ? (color + 25) : 255) + ', ' + ((color + 10) < 255 ? (color + 10) : 255) + ', ' + ((color - 35) > 0 ? (color - 35) : 0) + ')';

waar color de grijs waarde is.

het lijkt ergens op, maar volgens mij is dit niet echt sepia...
volgens wikipedia is sepia rgb(112, 66, 20), maar ik weet niet zo goed wat ik daar me moet, iets met procenten en verhoudingen gok ik?

[edit]
return 'rgb(' + ((color * 1.6969) < 255 ? Math.round(color * 1.6969) : 255) + ', ' + color + ', ' + ((color * 0.3030) > 0 ? Math.round(color * 0.3030) : 0) + ')';

dit lijkt ook nergens op... nu heb je geen zwart en wit meer....
[/edit]
sepia rgb(112, 66, 20) => #704214

color = ((R + G + B) / 3);
Dat komt neer op 'paars is even grijs als geel is even grijs als licht blauw'.
santhe, nu ben je me ff kwijt... het gemiddelde van die 3 waardes is toch grijs? hoe maak je volgens jou dan de goede grijs?
ow wacht eens... een vriend zij eens dat er in een camera steeds een rode een blauwe en 2 groene cellen zitten, is het zo iets?

dat sepia #704214 is kan ik volgen, maar wat ben ik daar me geholpen?
een sepia foto gaat van zwart naar wit met daartussen licht sepia, sepia en donker sepia zal ik maar zeggen.
daar wil ik een kloppende formule voor vinden... en daar is nu een kloppende formule voor grijs bij gekomen.
Wil je nou de sepia kleur of zoals bij een oude foto?
Dat is mij in ieder geval nog niet gelukt.

color = ((R + G + B) / 3);
color = ((FF + FF + 00) / 3) => geel
color = ((FF + 00 + FF) / 3) => paars
color = ((00 + FF + FF) / 3) => licht blauw

Rekenkundig geven ze alledrie dezelfde uitkomst.
karl, ik wil voor een gegeven kleur de sepia kleur berekenen alsof die kleur een pixel is in een sepia foto.

wikipedia: Adobe recommends setting Hue = 27 and Saturation = 21 and checking the Colorize box in the Hue/Saturation filter in Photoshop.

maar bij javascript heb je geen hue/saturation toch? dus ik zoek een manier om toch de kleur te 'verschuiven' naar sepia.

als we dat weten kunnen we wel wat experimenteren...
0, 0, 0 = 0, 0, 0
63, 63, 63 = 76, 62, 50 = +13, -1 -13
127, 127, 127 = 154, 125, 101 = +27, -2, -26
170, 170, 170 = 188, 169, 153 = +18, -1, -17
255, 255, 255 = 255, 255, 255

ik moet nog even denken wat ik daar nu aan heb hoor...

[edit]
ik heb het denk ik!!!
diff = (Math.abs(Math.abs(color - 127.5) - 127.5) / 4);
//alert(color +": "+ diff);
return 'rgb(' + ((color + diff) < 255 ? Math.round(color + diff) : 255) + ', ' + color + ', ' + ((color - diff) > 0 ? Math.round(color - diff) : 0) + ')';


nu alleen nog uitvinden wat er nou mis is met mijn grijs berekening....

Dit is een PHP manier om grayscale te berekenen:
<?php
public function yiq ($r,$g,$b) {
return (($r * 0.299) + ($g * 0.587) + ($b * 0.114));
}

public function to_grayscale ($grayfile) {
list($width, $height) = getimagesize ($this->path);
$src = imagecreatefromjpeg ($this->path);
$dst= imagecreate ($width, $height);
for ($c = 0; $c < 256; $c++) {
$palette[$c] = imagecolorallocate ($dst, $c, $c, $c);
}
for ($y = 0; $y < $height; $y++) {
for ($x = 0; $x < $width; $x++) {
$rgb = imagecolorat ($src, $x, $y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;

//This is where we actually use yiq to modify our rbg values, and then convert them to our grayscale palette
$gs = $this->yiq ($r, $g, $b);
imagesetpixel ($dst, $x, $y, $palette[$gs]);
}
}
imagejpeg ($dst, $grayfile, $this->jpg_quality);
}
?>
Edit: hou er rekening mee dat deze functies bij mij in een class zitten. Je moet dus nog wat keywords aanpassen, zoals $this.
dit lijk sterk op een stukje dat ik eerder heb gezien, met al die bitwise operators.
de magie zit hem in de yiq denk ik he?
wat ik eigenlijk doe is ze allemaal door 0.333 delen, wat jij doet is net een andere verhouding, want die 3 getallen bij elkaar opgeteld is precies 1

ik neem aan dat je die getallen niet uit je duim hebt gezogen, hoe kom je daar aan?

als mijn javascript dingetje werkt ga ik misschien ook nog wel iets maken om plaatjes te doen met php en ajax.

[edit]
sorry, had ik toch bijna bij de 'te-lui-om-te-googelen' categorie behoort...
http://en.wikipedia.org/wiki/YIQ
heel erg bedankt... alleen staat er bij grijs dit:
outputColor = (inputRed + inputGreen + inputBlue) / 3
en dat was juist niet de bedoeling toch?

de methode voor sepia vind ik wel goed, ik had het allen mooier gevonden als er had gestaan
If any of these output values is greater than 255, you simply set it to 255. These specific values are the values for sepia tone that are recommended by Adobe
inplaats van microsoft.....

[edit]
http://blogs.adobe.com/kevin.goldsmith/2007/10/writing_a_fadet_2.html
heeft nog een ander lijstje waardes... nog meer suggesties?

Reageren