Page 1 of 1

change resolution, resize and frame

Posted: 2015-09-15T19:57:01-07:00
by canellas
Hi everyone!

My goal is to prepare a file image file to be printed, in the maximum possible resolution, with a frame.

So, I have an image with W pixels vs H pixels (Wp x Hp), with a resolution of D dots/in. The paper size is W inches x H inches (Wi x Hi), and I would like a frame with M inches (Mi) of white margin.

I thought I had the math right, and the problem would be using IM to get what I want, but after so many tries, I am not sure of the math anymore, and IM is sitll an issue.

I tried over and over to write a Linux shell script, but with no success, so I would appreciate a lot if someone could help me.

Thanks a lot!

Re: change resolution, resize and frame

Posted: 2015-09-15T21:07:04-07:00
by fmw42
Post your image to dropbox.com and put the URL here.

Do you want to replace Mi inches border around the image by white to have Wi x Hi print output or do you want to reduce the image size in pixels to add Mi inches to the border to have Wi x Hi print output?

Re: change resolution, resize and frame

Posted: 2015-09-16T06:19:56-07:00
by canellas
Hi fmw42, and thanks for your answer!

I would like to reduce the image size in pixels to add Mi inches to the border to have Wi x Hi print output.

The file is not at dropbox, but you can it here https://copy.com/Q3hGUHy2wSbMYyb7.

Thanks!!

Re: change resolution, resize and frame

Posted: 2015-09-16T09:03:43-07:00
by canellas
Fred,

I came up with this script, which does not create the margin yet:

#! /bin/sh

# 30.5 cm page size (12 inches), less 2 centimeters
final_size_in=`echo "(112205 / 10000)" | bc -l`
echo "$final_size_in"

# TODO: pass page and margin size as parameters

if [ $# -eq 0 ]; then
echo "Sintax: `basename $0` list-arqs"
exit 10
fi

for full_file_name in "$@"; do
echo -n "$full_file_name: "
if [ ! -f "$full_file_name" ]; then
echo " does not exist!";
else

# x and y resolution
x_res=`identify -format "%x" $full_file_name`
y_res=`identify -format "%y" $full_file_name`

if [ $x_res != $y_res ]; then
echo "Cant handle differente X and Y resolutions"
else
# width and height in pixels
w_px=`identify -format "%w" $full_file_name`
h_px=`identify -format "%h" $full_file_name`

# resolution candidate 1
r1=`echo "($w_px / $final_size_in)" | bc -l`

# resolution candidate 2
r2=`echo "($h_px / $final_size_in)" | bc -l`

# crossing resolutions
h_in_using_r1=`echo "( $h_px / $r1 )" | bc -l`
w_in_using_r2=`echo "($w_px / $r2)" | bc -l`

# which fits best?
r2_gt_r1=`echo "($w_in_using_r2 > $h_in_using_r1)" | bc`
if [ $r2_gt_r1 -eq 1 ]; then
r=$r2
else
r=$r1
fi

# converting
new_full_file_name="M_$full_file_name"
convert $full_file_name -density $r -quality 100 $new_full_file_name

# dit it work?
new_x_res=`identify -format "%x" $new_full_file_name`
new_y_res=`identify -format "%y" $new_full_file_name`

# report
echo "w_px = $w_px, h_px = $h_px, r1 = $r1, r2 = $r2, h_in_using_r1 = $h_in_using_r1, w_in_using_r2 = $w_in_using_r2, r = $r, new_x_res = $new_x_res, new_y_res = $new_y_res"

fi

fi
done


I tested in 4 files, and, I dont know why, it did not work in 1 of them. IM did not report any error.

Again, thanks for your help

Re: change resolution, resize and frame

Posted: 2015-09-16T10:11:21-07:00
by canellas
I will create a larger frame. The total image should have 12" in its shortest size.

Re: change resolution, resize and frame

Posted: 2015-09-16T10:30:26-07:00
by canellas
Odd... 'identify -format "%w-$h, %x-%y" reports for each file:
M_2013-07-18-0047.jpg: 2848-4272, 72-72
M_2013-10-15-0004.jpg: 3748-2843, 253-253
M_2015-07-11-0001.jpg: 4000-6000, 350-350
M_2015-09-15-0004.jpg: 4000-6000, 350-350

But Gimp, as well Phatch say theirs resolution is 72x72, except for M_2013-10-15-0004.jpg.
I noticed that the original file for M_2015-07-11-0001.jpg and M_2015-09-15-0004.jpg already had a resolution of 350x350 (I must have edited them manually), while M_2013-10-15-0004.jpg was originally 72x72. M_2013-07-18-0047.jpg was 72x72 and remained that way.

I'll try to understand what happened.

Re: change resolution, resize and frame

Posted: 2015-09-16T10:39:44-07:00
by fmw42
This seems to work for me on your image, though I have not printed it. Using IM 6.9.2.1 Q16 Mac OSX

Code: Select all

# assume the following three dimensions are in inches
size1=8.5
size2=11
frame=1
infile="2013-10-15-0004.jpg"
inname=`convert "$infile" -format "%t" info:`
suffix=`convert "$infile" -format "%e" info:`
ww=`identify -ping -format "%w" "$infile"`
hh=`identify -ping -format "%h" "$infile"`
#echo "ww=$ww; hh=$hh;"

# set WW and HH to match aspect of ww and hh
if [ $ww -le $hh ]; then
    WW=$size1
    HH=$size2
else
    WW=$size2
    HH=$size1
fi
#echo "WW=$WW; HH=$HH;"

# compute resolutions so wwxhh will fit to WWxHH
xres=`convert xc: -format "%[fx:$ww/$WW]" info:`
yres=`convert xc: -format "%[fx:$hh/$HH]" info:`

# compute desired image width and height to match sizes of WW*xres and HH*yres
wwd1=`convert xc: -format "%[fx:round($WW*$xres)]" info:`
hhd1=`convert xc: -format "%[fx:round($HH*$yres)]" info:`

# compute desired image width and height less white frame border
wwd2=`convert xc: -format "%[fx:round(($WW-$frame)*$xres)]" info:`
hhd2=`convert xc: -format "%[fx:round(($HH-$frame)*$yres)]" info:`
#echo "xres=$xres; yres=$yres; wwd1=$wwd1; hhd1=$hhd1; wwd2=$wwd2; hhd2=$hhd2"

convert "$infile" -resize ${wwd2}x${hhd2} \
    -gravity center -background white -extent ${wwd1}x${hhd1} \
    -units PixelsPerInch -density ${xres}x${yres} "${inname}_framed.$suffix"

Re: change resolution, resize and frame

Posted: 2015-09-16T10:46:54-07:00
by canellas
Thanks!

I will try it and let you asap.

Re: change resolution, resize and frame

Posted: 2015-09-16T11:52:19-07:00
by canellas
Fred,

Thanks a lot!

I did not use your solution, as I dont have both page sizes (your 'size2' variable), but just a limit of 30.5 centimeters for one of the sides. The other can vary its length freely.

However, only studying your example was that I saw the need for '-units PixelsPerInch'!

Also thanks to your code, it'll be much easier to insert the frame (but I'll take a look at it later night).

Thanks!!

Re: change resolution, resize and frame

Posted: 2015-09-16T12:11:08-07:00
by fmw42
Is the 30.5 cm for the shorter or longer side? If I know that, I can adjust the script.

Re: change resolution, resize and frame

Posted: 2015-09-16T12:44:34-07:00
by canellas
It is for the shorter side.

Re: change resolution, resize and frame

Posted: 2015-09-16T14:22:31-07:00
by fmw42
OK. Try this

Code: Select all

# resize, pad with border and set densities
# assume the following size is in cm and frame is in inches
size=30.5
frame=1
infile="2013-10-15-0004.jpg"
inname=`convert "$infile" -format "%t" info:`
suffix=`convert "$infile" -format "%e" info:`
ww=`identify -ping -format "%w" "$infile"`
hh=`identify -ping -format "%h" "$infile"`

#convert size to inches
size=`convert xc: -format "%[fx:$size/2.54]" info:`
#echo "ww=$ww; hh=$hh; size=$size"

# set small dimension to match size
if [ $ww -le $hh ]; then
    WW=$size
    res=`convert xc: -format "%[fx:$ww/$WW]" info:`
    HH=`convert xc:  -format "%[fx:$hh/$res]" info:`
else
    HH=$size
    res=`convert xc: -format "%[fx:$hh/$HH]" info:`
    WW=`convert xc:  -format "%[fx:$ww/$res]" info:`
fi
#echo "WW=$WW; HH=$HH; res=$res;"

# compute desired image width and height to match WW*res and HH*res
wwd1=`convert xc: -format "%[fx:round($WW*$res)]" info:`
hhd1=`convert xc: -format "%[fx:round($HH*$res)]" info:`

# compute desired image width and height less white frame border
wwd2=`convert xc: -format "%[fx:round(($WW-$frame)*$res)]" info:`
hhd2=`convert xc: -format "%[fx:round(($HH-$frame)*$res)]" info:`
#echo "res=$res; wwd1=$wwd1; hhd1=$hhd1; wwd2=$wwd2; hhd2=$hhd2"

convert "$infile" -resize ${wwd2}x${hhd2} \
    -gravity center -background white -extent ${wwd1}x${hhd1} \
    -units PixelsPerInch -density ${xres}x${yres} "${inname}_framed2.$suffix"

Re: change resolution, resize and frame

Posted: 2015-09-17T05:34:20-07:00
by canellas
Fred,

I didnt have time to run your code yesterday. I'll let you know as soon as I do it.

Thanks a lot!