resize files Help if smaller then don't resize

Questions and postings pertaining to the development of ImageMagick, feature enhancements, and ImageMagick internals. ImageMagick source code and algorithms are discussed here. Usage questions which are too arcane for the normal user list should also be posted here.
Post Reply
winracer

resize files Help if smaller then don't resize

Post by winracer »

here is the code I am using below,
what I want if the files is smaller then
$max_width = "400";
$max_height = "400";

don't resize and if lrger resize to

$max_width = "400";
$max_height = "400";

does anyone know how I would do this.


Code: Select all



<?php

// Setup the maximium width and height for the finished image code came from http://www.rubblewebs.co.uk/imagemagick/codes/auto_thumb.php
$max_width = "400";
$max_height = "400";

// Directory containing the images - need the trailing slash / 
$read = 'upload/'; 
$read1 = 'thumbs/';   
// Open the directory and create an array of the images 
$myDirectory = opendir( $read ); 
  
while( $entryName = readdir( $myDirectory )) 
{ 
// This will only select jpg images from the folder 
foreach (glob($dir."{*.jpg,*.png,*.gif}",GLOB_BRACE ) as $filename) { 
$dirArray[]=$entryName; 
} 
}    
closedir( $myDirectory ); 
  
// Count the number of images 
$indexCount = count($dirArray); 
  
for ( $i=0; $i<$indexCount; $i++ ) 
{ 

$name = $read.$dirArray[$i]; 

// Save resized images as folder/thumb_original name
//$new_name = $read1."thumb_".$dirArray[$i];

$new_name = $read1.$dirArray[$i];


// Get the image size for use in the code
$size=GetImageSize( $name ); 
exec("convert -size {$size[0]}x{$size[1]} $name -thumbnail $max_widthx$max_height $new_name"); 

} 
?> 

Bonzo
Posts: 2971
Joined: 2006-05-20T08:08:19-07:00
Location: Cambridge, England

Re: resize files Help if smaller then don't resize

Post by Bonzo »

I would use php to check the size as ImageMagick reads the image in checks the size and even if its not resized IM saves it which adds jpg compression.

These are the ImageMagick settings but I can not remember which one to use: http://www.imagemagick.org/script/comma ... p#geometry

Code: Select all


// Get the image size for use in the code
$size=GetImageSize( $name );

if( ( $size[0] > 400 ) or ( $size[1] > 400 ) {
exec("convert -size {$size[0]}x{$size[1]} $name -thumbnail $max_widthx$max_height $new_name"); 
}
Drarakel
Posts: 547
Joined: 2010-04-07T12:36:59-07:00
Authentication code: 8675308

Re: resize files Help if smaller then don't resize

Post by Drarakel »

If you add further operations to your ImageMagick command, then the usage of the '>' symbol ("-thumbnail $max_widthx$max_height\>") would be enough, as this does shrink only larger images.
But for your current commands, Bonzo's solution is probably better (copy directly the input file if it's not larger).
winracer

Re: resize files Help if smaller then don't resize

Post by winracer »

thanks for your help. I will give it a try and let you know. again thanks
winracer

Re: resize files Help if smaller then don't resize

Post by winracer »

thanks for your help works great.
Made a few changes....

Code: Select all


<?php
$convert = '/usr/bin/convert';
$identify = '/usr/bin/identify';

// Setup the maximium width and height for the finished image http://www.rubblewebs.co.uk/imagemagick/codes/auto_thumb.php
$max_width = "400";
$max_height = "400";

  $read = 'upload/'; 
$read1 = 'thumbs/';


// Open the directory and create an array of the images 
$myDirectory = opendir( $read ); 
  
while($entryName = readdir($myDirectory)) 
{ 
// This will only select jpg images from the folder 

$dirArray = array(); 
foreach (glob($dir."{*.jpg,*.png,*.gif}",GLOB_BRACE ) as $filename) { 
$dirArray = $entryName; 
} 

echo $entryName."\n<br />";
// Directory containing the images - need the trailing slash / 
$input = "upload/$entryName";
$output = "thumbs/$entryName";

$size = GetImageSize($input); 

exec("convert -size {$size[0]}x{$size[1]} $input -thumbnail $max_widthx$max_height\> $output"); 

$totalimages = array( $entryName );
$totalElements = count( $totalimages );


for ( $i=0; $i < $totalElements; $i++ ) {
 // echo $totalimages[$i]."<br />";
 $C++;

// echo $C."<br />";
//if ( $i < $totalElements -1 ) echo ", ";
 

}
}
closedir($myDirectory); 

echo $C." Total<br />";
?> 


User avatar
anthony
Posts: 8883
Joined: 2004-05-31T19:27:03-07:00
Authentication code: 8675308
Location: Brisbane, Australia

Re: resize files Help if smaller then don't resize

Post by anthony »

Before finishing, you need to ask one simple question. Is security a concern?

For example you do $entryName = readdir($myDirectory) which means the value comes from the the directory. Can you be certain a malicious user has not put in some weird filename in that directory. For example one that contains quotes, spaces, returns, semi-colons, wildcards, etc etc etc?

Also while you test for the suffix, can you be sure that you couldn't have a sub-directory name also having that same suffix! For example a directory called "some.gif"? You should at least have a 'filetype' test as a minimum so as to ignore special files, like directories, or named pipes.

If it is only a user script no problem. but if the PHP is being used from a web server, then you may need better 'taint' checking of file and directory names. Remember under UNIX/Linux a filename can contain ANY CHARACTER (except NULL and SLASH).

Most IM scripts do not worry about this type of thing as they are not meant for a insecure environment, but PHP is usually meant for web servers which is an 'insecure' environment.
Anthony Thyssen -- Webmaster for ImageMagick Example Pages
https://imagemagick.org/Usage/
winracer

Re: resize files Help if smaller then don't resize

Post by winracer »

anthony wrote:Before finishing, you need to ask one simple question. Is security a concern?

For example you do $entryName = readdir($myDirectory) which means the value comes from the the directory. Can you be certain a malicious user has not put in some weird filename in that directory. For example one that contains quotes, spaces, returns, semi-colons, wildcards, etc etc etc?

Also while you test for the suffix, can you be sure that you couldn't have a sub-directory name also having that same suffix! For example a directory called "some.gif"? You should at least have a 'filetype' test as a minimum so as to ignore special files, like directories, or named pipes.

If it is only a user script no problem. but if the PHP is being used from a web server, then you may need better 'taint' checking of file and directory names. Remember under UNIX/Linux a filename can contain ANY CHARACTER (except NULL and SLASH).

Most IM scripts do not worry about this type of thing as they are not meant for a insecure environment, but PHP is usually meant for web servers which is an 'insecure' environment.


thanks so I should do somting like

$filetype = jpg,*.png,*.gif;
$dirArray = array();
foreach (glob($dir."{$filetype}",GLOB_BRACE ) as $filename) {
$dirArray = $entryName;
User avatar
anthony
Posts: 8883
Joined: 2004-05-31T19:27:03-07:00
Authentication code: 8675308
Location: Brisbane, Australia

Re: resize files Help if smaller then don't resize

Post by anthony »

winracer wrote:thanks so I should do somting like

$filetype = jpg,*.png,*.gif;
$dirArray = array();
foreach (glob($dir."{$filetype}",GLOB_BRACE ) as $filename) {
$dirArray = $entryName;
That does not change anything. What you need to do (at a minimum) is file test to see if the filename is a plain_file or directory (or something else) and then either junk the filename or store it for later processing (if recursing in to sub-directories).

I am not certain how that is done in PHP.


Also checking for 'unusual characters' is a good security measure if you can be unsure of the environment the script is being used in.
My list of unusual characters include... ; | ^ & ` > < * ? [ ] \ ' " $ % space tab return newline
Also exclude : if you passing the file name to IM

Alternately exclude all characters except A-Z a-Z 0-9 _ - + = .

You may also want to exclude / from input names if paths are not permitted, or things like . and .. if relative paths they are permitted.

Basically security is a matter of restriction in un-controlled environments. On the other hand restricting users is a bad thing if the script is not directly used in controlled environment (web, daemon and network services)
Anthony Thyssen -- Webmaster for ImageMagick Example Pages
https://imagemagick.org/Usage/
winracer

Re: resize files Help if smaller then don't resize

Post by winracer »

anthony wrote:
winracer wrote:thanks so I should do somting like

$filetype = jpg,*.png,*.gif;
$dirArray = array();
foreach (glob($dir."{$filetype}",GLOB_BRACE ) as $filename) {
$dirArray = $entryName;
That does not change anything. What you need to do (at a minimum) is file test to see if the filename is a plain_file or directory (or something else) and then either junk the filename or store it for later processing (if recursing in to sub-directories).

I am not certain how that is done in PHP.


Also checking for 'unusual characters' is a good security measure if you can be unsure of the environment the script is being used in.
My list of unusual characters include... ; | ^ & ` > < * ? [ ] \ ' " $ % space tab return newline
Also exclude : if you passing the file name to IM

Alternately exclude all characters except A-Z a-Z 0-9 _ - + = .

You may also want to exclude / from input names if paths are not permitted, or things like . and .. if relative paths they are permitted.

Basically security is a matter of restriction in un-controlled environments. On the other hand restricting users is a bad thing if the script is not directly used in controlled environment (web, daemon and network services)

thanks for your help ans I will work on it.
Post Reply