X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FController%2FHelper%2FThumbnailCreator.pm;fp=SL%2FController%2FHelper%2FThumbnailCreator.pm;h=072d89d76ce0e1420cac21ea98d0ff787edd8b12;hb=0bfbcce6e77e0f9d83e4f54f3fe9da7edcc866f3;hp=0000000000000000000000000000000000000000;hpb=1ce68041a1923c60a6608a2ed6365f5915bacd9a;p=kivitendo-erp.git diff --git a/SL/Controller/Helper/ThumbnailCreator.pm b/SL/Controller/Helper/ThumbnailCreator.pm new file mode 100644 index 000000000..072d89d76 --- /dev/null +++ b/SL/Controller/Helper/ThumbnailCreator.pm @@ -0,0 +1,144 @@ +package SL::Controller::Helper::ThumbnailCreator; + +use strict; + +use SL::Locale::String qw(t8); +use Carp; +use GD; +use Image::Info; +use File::MimeInfo::Magic; +use List::MoreUtils qw(apply); +use List::Util qw(max); +use Rose::DB::Object::Util; + +require Exporter; +our @ISA = qw(Exporter); +our @EXPORT = qw(file_create_thumbnail file_update_thumbnail file_probe_type file_probe_image_type file_update_type_and_dimensions); + +# TODO PDFs and others like odt,txt,... +our %supported_mime_types = ( + 'image/gif' => { extension => 'gif', convert_to_png => 1, }, + 'image/png' => { extension => 'png' }, + 'image/jpeg' => { extension => 'jpg' }, + 'image/tiff' => { extension => 'tif'}, +); + +sub file_create_thumbnail { + my ($self) = @_; + croak "No picture set yet" if !$self->file_content; + + my $image = GD::Image->new($self->file_content); + my ($width, $height) = $image->getBounds; + my $max_dim = 64; + my $curr_max = max $width, $height, 1; + my $factor = $curr_max <= $max_dim ? 1 : $curr_max / $max_dim; + my $new_width = int($width / $factor + 0.5); + my $new_height = int($height / $factor + 0.5); + my $thumbnail = GD::Image->new($new_width, $new_height); + + $thumbnail->copyResized($image, 0, 0, 0, 0, $new_width, $new_height, $width, $height); + + $self->thumbnail_img_content($thumbnail->png); + $self->thumbnail_img_content_type('image/png'); + $self->thumbnail_img_width($new_width); + $self->thumbnail_img_height($new_height); + return 1; + +} + +sub file_update_thumbnail { + my ($self) = @_; + + return 1 if !$self->file_content || !$self->file_content_type || !Rose::DB::Object::Util::get_column_value_modified($self, 'file_content'); + $self->file_create_thumbnail; + return 1; +} + +sub file_probe_image_type { + my ($self, $mime_type, $basefile) = @_; + + if ( !$supported_mime_types{ $mime_type } ) { + $self->js->flash('error',t8('file \'#1\' has unsupported image type \'#2\' (supported types: #3)', + $basefile, $mime_type, join(' ', sort keys %supported_mime_types))); + return 1; + } + return 0; +} + +sub file_probe_type { + my ($self) = @_; + + return (t8("No file uploaded yet")) if !$self->file_content; + my $mime_type = File::MimeInfo::Magic::magic($self->file_content); + + my $info = Image::Info::image_info(\$self->{file_content}); + if (!$info || $info->{error} || !$info->{file_media_type} || !$supported_mime_types{ $info->{file_media_type} }) { + $::lxdebug->warn("Image::Info error: " . $info->{error}) if $info && $info->{error}; + return (t8('Unsupported image type (supported types: #1)', join(' ', sort keys %supported_mime_types))); + } + + $self->file_content_type($info->{file_media_type}); + $self->files_img_width($info->{width}); + $self->files_img_height($info->{height}); + $self->files_mtime(DateTime->now_local); + + $self->file_create_thumbnail; + + return (); +} + +sub file_update_type_and_dimensions { + my ($self) = @_; + + return () if !$self->file_content; + return () if $self->file_content_type && $self->files_img_width && $self->files_img_height && !Rose::DB::Object::Util::get_column_value_modified($self, 'file_content'); + + my @errors = $self->file_probe_type; + return @errors if @errors; + + my $info = $supported_mime_types{ $self->file_content_type }; + if ($info->{convert_to_png}) { + $self->file_content(GD::Image->new($self->file_content)->png); + $self->file_content_type('image/png'); + $self->filename(apply { s/\.[^\.]+$//; $_ .= '.png'; } $self->filename); + } + return (); +} + +1; +__END__ + +=pod + +=encoding utf8 + +=head1 NAME + + SL::DB::Helper::ThumbnailCreator - DatabaseClass Helper for Fileuploads + +=head1 SYNOPSIS + + use SL::DB::Helper::ThumbnailCreator; + + # synopsis... + +=head1 DESCRIPTION + + # longer description.. + +=head1 AUTHOR + + Werner Hahn Ewh@futureworldsearch.netE + +=cut + + +=head1 INTERFACE + + +=head1 DEPENDENCIES + + +=head1 SEE ALSO + +