From: Sven Schöling Date: Tue, 23 Jun 2015 09:48:47 +0000 (+0200) Subject: Image Maps ohne GD X-Git-Tag: release-3.3.0beta~31^2~35 X-Git-Url: http://wagnertech.de/git?a=commitdiff_plain;h=ad048c7322ac24524dace99d1bbb09d5e14bc213;p=kivitendo-erp.git Image Maps ohne GD GD verliert bei Palette pngs die Transparenz, und Stackoverflow findet ad hoc nichts wie das zu fixen ist. --- diff --git a/scripts/image_maps.pl b/scripts/image_maps.pl index f025340ab..a38e4170b 100755 --- a/scripts/image_maps.pl +++ b/scripts/image_maps.pl @@ -1,15 +1,16 @@ #!/usr/bin/perl use strict; -use GD; use Getopt::Long; use File::Basename; - my $css_file = 'generated.css'; my $image_file = 'generated.png'; my $class_for_map = 'icon'; +my $convert_bin = 'convert'; +my $identify_bin = 'identify'; + GetOptions( 'css-out=s' => \$css_file, 'image-out=s' => \$image_file, @@ -17,69 +18,67 @@ GetOptions( ); my @files = @ARGV; -my @gd_images; - -GD::Image->trueColor(1); +my @images; # read files -for my $filename (@files) { - my $image = GD::Image->newFromPng($filename); +for my $filename (sort @files) { + my $image = `$identify_bin $filename`; if (!defined $image) { - warn "warning: could not load image '$filename'. skpping..."; + warn "warning: could not identify image '$filename'. skpping..."; next; } - push @gd_images, { - gd => $image, + $image =~ /^(?\S+) \s (?\S+) \s (?\d+) x (?\d+)/x; + push @images, { filename => $filename, + type => $+{type}, + width => $+{width}, + height => $+{height}, }; } # make target layout # for simplification thi will check if all the images have the same dimensions # and croak if not -my $first_height = $gd_images[0]->{gd}->height; -my $first_width = $gd_images[0]->{gd}->width; +my $first_height = $images[0]->{height}; +my $first_width = $images[0]->{width}; use Data::Dumper; -for my $img (@gd_images) { - die 'heights are not equal' if $first_height != $img->{gd}->height; - die 'widths are not equal' if $first_width != $img->{gd}->width; +for my $img (@images) { + die 'heights are not equal' if $first_height != $img->{height}; + die 'widths are not equal' if $first_width != $img->{width}; } # all equal? nice. # we'll be lazy and just put them all together left-to-right my $new_height = $first_height; -my $new_width = $first_width * @gd_images; +my $new_width = $first_width * @images; -my $new_image = GD::Image->new($new_width, $new_height, 1); # now copy them all together, and keep a referende to; -$new_image->saveAlpha(1); -$new_image->alphaBlending(0); +my $convert_string = "$convert_bin "; my $h_offset = 0; -for (@gd_images) { +for (@images) { $_->{h_offset} = $h_offset; $_->{v_offset} = 0; - $new_image->copy($_->{gd}, $_->{h_offset}, $_->{v_offset}, 0, 0, $_->{gd}->width, $_->{gd}->height); + $convert_string .= ' +append ' . $_->{filename}; } continue { - $h_offset += $_->{gd}->width; + $h_offset += $_->{width}; } +$convert_string .= " -background none +append $image_file"; + # now write that png... -{ - open my $file, '>:raw', $image_file or die "can't write to $image_file"; - print $file $new_image->png; -} +system($convert_string); # make css file { open my $file, ">", $css_file or die "can't write too $css_file"; print $file ".$class_for_map { background: url(../$image_file) ${first_width}px 0px no-repeat; padding: 0; width: ${first_width}px; height: ${first_height}px; }\n"; - for (@gd_images) { + for (@images) { my $name = fileparse($_->{filename}, ".png"); # the full grammar for valid css class names is completely bonkers (to put it mildly).