* marc lindahl <marc@bowery.com> [2002-01-04 03:17 +0000]:
From: J M Cerqueira Esteves <jmce@artenumerica.com>
The main difference is that Photo defines new dimensions with integer truncation, while Image Magick rounds each to the nearest integer (when results of both calculations are different, the aspect ratio is closer to the original with Image Magick).
But then you can go 1 pixel outside your 'bounding box' - is that more desirable?
It never goes outside the hM×wM 'bounding box'... unless you request hM == 0 or wM == 0. The algorithm is scale = min (float (wM) / w0, float (hM) / h0) width = max (int (scale * w0 + 0.5), 1) height = max (int (scale * h0 + 0.5), 1) Suppose hM >= 1, wM >= 1, and float (wM) / w0 <= float (hM) / h0. Then: scale == float (wM) / w0 width == max (int (float (wM) / w0 * w0 +0.5), 1) Unless the result of float (wM) / w0 * w0 falls outside of the interval ] wM-0.5, wM+0.5 [ (can you think of a case where arithmetic would cause such an error?) we then have width == max (wM, 1) == wM and height == max (int (float(wM) / w0 * h0 + 0.5), 1). Since we are assuming float (wM) / w0 <= float (hM) / h0, then height <= max (int (float(hM) / h0 * h0 + 0.5), 1) and unless arithmetic errors make float (hM) / h0 * h0 >= hM+0.5 we can conclude that height <= max (hM, 1), i.e., in our case, height <= hM. In the case float (wM) / w0 >= float (hM) / h0 one can show in the same way that width <= wM, height == hM . If one is still worried about the possibility of errors above 0.5 when calculating float (wM) / w0 * w0 or float (hM) / h0 * h0, one can simply change the algorithm above into sw = float (wM) / w0 sh = float (hM) / h0 if sw <= sh: width = wM height = int (sw * h0 + 0.5) else: width = int (sh * w0 + 0.5) height = hM (now respecting zero values for wM and hM).