Skip to content

Commit d4f9b68

Browse files
committed
start implement lab
1 parent 225ecfd commit d4f9b68

File tree

1 file changed

+19
-34
lines changed
  • lib/Graphics/Toolkit/Color/Space/Instance

1 file changed

+19
-34
lines changed

lib/Graphics/Toolkit/Color/Space/Instance/LAB.pm

Lines changed: 19 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -5,27 +5,36 @@ use warnings;
55

66
package Graphics::Toolkit::Color::Space::Instance::LAB;
77
use Graphics::Toolkit::Color::Space;
8+
se Graphics::Toolkit::Color::Space::Util qw/mult_matrix apply_d65 remove_d65/;
89

9-
my ($i_max, $q_max) = (0.5959, 0.5227);
10-
my ($i_size, $q_size) = (2 * $i_max, 2 * $q_max);
11-
# cyan-orange balance, magenta-green balance
12-
my $lab_def = Graphics::Toolkit::Color::Space->new( axis => [qw/L* a* b*/],
10+
my $lab_def = Graphics::Toolkit::Color::Space->new( axis => [qw/L* a* b*/], #
1311
prefix => 'CIE',
14-
range => [1, [-$i_max, $i_max], [-$q_max, $q_max]] );
12+
range => [100, 500, 200] );
1513

1614
$lab_def->add_converter('RGB', \&to_rgb, \&from_rgb );
1715

1816
sub from_rgb {
1917
my ($r, $g, $b) = @_;
20-
my $y = (0.299 * $r) + ( 0.587 * $g) + ( 0.114 * $b);
21-
my $i = ($i_max + (0.5959 * $r) + (-0.2746 * $g) + (-0.3213 * $b)) / $i_size;
22-
my $q = ($q_max + (0.2115 * $r) + (-0.5227 * $g) + ( 0.3112 * $b)) / $q_size;
23-
return ($y, $i, $q);
18+
my ($x, $y, $z) = mult_matrix([[0.4124564, 0.2126729, 0.0193339],
19+
[0.3575761, 0.7151522, 0.1191920],
20+
[0.1804375, 0.0721750, 0.9503041]],
21+
apply_d65( $r ), apply_d65( $g ), apply_d65( $b ));
22+
$x /= 0.95047;
23+
$z /= 0.108883;
24+
25+
$x = ($x > 0.008856) ? ($x ** (1/3)) : (7.7870689 * $x + 0.137931034);
26+
$y = ($y > 0.008856) ? ($y ** (1/3)) : (7.7870689 * $y + 0.137931034);
27+
$z = ($z > 0.008856) ? ($z ** (1/3)) : (7.7870689 * $z + 0.137931034);
28+
29+
my $l = (116 * $y) - 16;
30+
my $a = 500 * ($x - $y);
31+
my $b = 200 * ($y - $z);
32+
return ($l, $a, $b);
2433
}
2534

2635

2736
sub to_rgb {
28-
my ($y, $i, $q) = @_;
37+
my ($l, $a, $b) = @_;
2938
$i = ($i * $i_size) - $i_max;
3039
$q = ($q * $q_size) - $q_max;
3140
my $r = $y + ( 0.956 * $i) + ( 0.619 * $q);
@@ -38,27 +47,3 @@ $lab_def;
3847

3948
__END__
4049
41-
sub from_rgb {
42-
my ($r, $g, $b) = @_;
43-
$r = ( $r > 0.04045 ) ? ((($r + 0.055) / 1.055 ) ** 2.4) : ($r / 12.92);
44-
$g = ( $g > 0.04045 ) ? ((($g + 0.055) / 1.055 ) ** 2.4) : ($g / 12.92);
45-
$b = ( $b > 0.04045 ) ? ((($b + 0.055) / 1.055 ) ** 2.4) : ($b / 12.92);
46-
47-
my $x = (0.4124564 * $r) + ( 0.3575761 * $g) + ( 0.1804375 * $b);
48-
my $y = (0.2126729 * $r) + ( 0.7151522 * $g) + ( 0.0721750 * $b);
49-
my $z = (0.0193339 * $r) + ( 0.1191920 * $g) + ( 0.9503041 * $b);
50-
return ($x, $y, $z);
51-
}
52-
53-
54-
sub to_rgb {
55-
my ($x, $y, $z) = @_;
56-
my $r = ( 3.2404542 * $x) + (-1.5371385 * $y) + (-0.4985314 * $z);
57-
my $g = (-0.9692660 * $x) + ( 1.8760108 * $y) + ( 0.0415560 * $z);
58-
my $b = ( 0.0556434 * $x) + (-0.2040259 * $y) + ( 1.0572252 * $z);
59-
60-
$r = ($r > 0.003131) ? ((($r**0.416666) * 1.055) - 0.055) : $r * 12.92;
61-
$g = ($g > 0.003131) ? ((($g**0.416666) * 1.055) - 0.055) : $g * 12.92;
62-
$b = ($b > 0.003131) ? ((($b**0.416666) * 1.055) - 0.055) : $b * 12.92;
63-
return ($r, $g, $b);
64-
}

0 commit comments

Comments
 (0)