@@ -5,27 +5,36 @@ use warnings;
5
5
6
6
package Graphics::Toolkit::Color::Space::Instance::LAB ;
7
7
use Graphics::Toolkit::Color::Space;
8
+ se Graphics::Toolkit::Color::Space::Util qw/ mult_matrix apply_d65 remove_d65/ ;
8
9
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*/ ], #
13
11
prefix => ' CIE' ,
14
- range => [1, [- $i_max , $i_max ], [- $q_max , $q_max ] ] );
12
+ range => [100, 500, 200 ] );
15
13
16
14
$lab_def -> add_converter(' RGB' , \&to_rgb, \&from_rgb );
17
15
18
16
sub from_rgb {
19
17
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 );
24
33
}
25
34
26
35
27
36
sub to_rgb {
28
- my ($y , $i , $q ) = @_ ;
37
+ my ($l , $a , $b ) = @_ ;
29
38
$i = ($i * $i_size ) - $i_max ;
30
39
$q = ($q * $q_size ) - $q_max ;
31
40
my $r = $y + ( 0.956 * $i ) + ( 0.619 * $q );
@@ -38,27 +47,3 @@ $lab_def;
38
47
39
48
__END__
40
49
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