diff options
author | Jesse Luehrs <doy@tozt.net> | 2014-10-07 14:16:15 -0400 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2014-10-07 14:56:01 -0400 |
commit | 12392181b58a25b8f63410d10759457e070ad24e (patch) | |
tree | e8424be87489c0a50adebe814cc77063b80e8696 | |
parent | c2372470164611b5597ea63faf8dcfe33381df39 (diff) | |
download | image-pnm-12392181b58a25b8f63410d10759457e070ad24e.tar.gz image-pnm-12392181b58a25b8f63410d10759457e070ad24e.zip |
support output in different formats from input
-rw-r--r-- | lib/Image/PNM.pm | 32 | ||||
-rw-r--r-- | t/P1.t | 28 | ||||
-rw-r--r-- | t/P2.t | 27 | ||||
-rw-r--r-- | t/P3.t | 27 |
4 files changed, 111 insertions, 3 deletions
diff --git a/lib/Image/PNM.pm b/lib/Image/PNM.pm index 5a97439..5136220 100644 --- a/lib/Image/PNM.pm +++ b/lib/Image/PNM.pm @@ -82,7 +82,16 @@ $self->{w} $self->{h} HEADER for my $row (@{ $self->{pixels} }) { - $data .= join(' ', map { $_ ? '0' : '1' } @$row) . "\n"; + $data .= join(' ', map { + my $val; + if (ref($_)) { + $val = $self->_to_greyscale(@$_); + } + else { + $val = $_; + } + $val * 2 > $self->{max} ? '0' : '1' + } @$row) . "\n"; } return $data; @@ -98,7 +107,14 @@ $self->{max} HEADER for my $row (@{ $self->{pixels} }) { - $data .= join(' ', @$row) . "\n"; + $data .= join(' ', map { + if (ref($_)) { + $self->_to_greyscale(@$_) + } + else { + $_ + } + } @$row) . "\n"; } return $data; @@ -114,7 +130,9 @@ $self->{max} HEADER for my $row (@{ $self->{pixels} }) { - $data .= join(' ', map { join(' ', @$_) } @$row) . "\n"; + $data .= join(' ', map { + ref($_) ? join(' ', @$_) : "$_ $_ $_" + } @$row) . "\n"; } return $data; @@ -259,4 +277,12 @@ sub _make_next_word { }; } +sub _to_greyscale { + my $self = shift; + my ($r, $g, $b) = @_; + # luma calculation + # https://en.wikipedia.org/wiki/YUV + int(0.2126*$r + 0.7152*$g + 0.0722*$b + 0.5) +} + 1; @@ -26,4 +26,32 @@ P1 0 0 0 0 0 0 IMAGE +is($image->as_string('P2'), <<IMAGE); +P2 +6 8 +1 +1 1 1 1 1 1 +1 1 0 0 1 1 +1 0 1 1 0 1 +0 1 1 1 1 0 +0 0 0 0 0 0 +0 1 1 1 1 0 +0 1 1 1 1 0 +1 1 1 1 1 1 +IMAGE + +is($image->as_string('P3'), <<IMAGE); +P3 +6 8 +1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 +1 1 1 0 0 0 1 1 1 1 1 1 0 0 0 1 1 1 +0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 +0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +IMAGE + done_testing; @@ -13,6 +13,19 @@ is($image->max_pixel_value, 255); is_deeply($image->raw_pixel(1, 2), [78, 78, 78]); is_deeply($image->pixel(0, 0), [1, 1, 1]); +is($image->as_string('P1'), <<IMAGE); +P1 +6 8 +0 0 0 0 0 0 +0 0 1 1 0 0 +0 1 0 0 1 0 +1 0 0 0 0 1 +1 1 1 1 1 1 +1 0 0 0 0 1 +1 0 0 0 0 1 +0 0 0 0 0 0 +IMAGE + is($image->as_string('P2'), <<IMAGE); P2 6 8 @@ -27,4 +40,18 @@ P2 255 255 255 255 255 255 IMAGE +is($image->as_string('P3'), <<IMAGE); +P3 +6 8 +255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +255 255 255 255 255 255 78 78 78 78 78 78 255 255 255 255 255 255 +255 255 255 0 0 0 255 255 255 255 255 255 0 0 0 255 255 255 +0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 +0 0 0 54 54 54 54 54 54 54 54 54 54 54 54 0 0 0 +0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 +0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 +IMAGE + done_testing; @@ -13,6 +13,33 @@ is($image->max_pixel_value, 255); is_deeply($image->raw_pixel(1, 2), [0, 84, 255]); is_deeply($image->pixel(4, 1), [1, 0, 0]); +is($image->as_string('P1'), <<IMAGE); +P1 +6 8 +0 0 0 0 0 0 +0 0 1 1 0 0 +0 1 0 0 1 0 +1 0 0 0 0 1 +1 1 1 1 1 1 +1 0 0 0 0 1 +1 0 0 0 0 1 +0 0 0 0 0 0 +IMAGE + +is($image->as_string('P2'), <<IMAGE); +P2 +6 8 +255 +255 255 255 255 255 255 +255 255 78 78 255 255 +255 0 255 255 0 255 +0 255 255 255 255 0 +0 54 54 54 54 0 +0 255 255 255 255 0 +0 255 255 255 255 0 +255 255 255 255 255 255 +IMAGE + is($image->as_string('P3'), <<IMAGE); P3 6 8 |