

Scaled_img = cv2.copyMakeBorder(scaled_img, pad_top, pad_bot, pad_left, pad_right, borderType=cv2.PRO TIP: If you are not familiar with Canva or graphic design in general, we recommend that you do not attempt to free resize elements in Canva. If (saspect >= aspect) or ((saspect = 1) and (aspect = 1)): # new vertical image "saspect > aspect" should be "saspect >= aspect"Ĭredit goto "London guy" def resizeAndPad(img, size, padColor=255): If ( (saspect >= aspect) || ((saspect = 1) & (aspect = 1)))īColor = cv::Scalar(padColor, padColor, padColor) Ĭv::resize(src, dst, Size(new_w, new_h),None,None,interp) Ĭv::copyMakeBorder(dst, dst, pad_top, pad_bot, pad_left, pad_right, cv::BORDER_CONSTANT, bColor) New_h = np.round(float(new_w) / aspect).astype(int)Ĭ++ version of "London guy" int resizeAndPad(cv::Mat &src, cv::Mat& dst /*output*/, Size size, int padColor = 0)įloat pad_horz, pad_left, pad_right, pad_top, pad_bot, pad_vert If (saspect > aspect) or ((saspect = 1) and (aspect = 1)): # new vertical image def resizeAndPad(img, size, padColor=255):
#CANVA RESIZE IMAGE WITHOUT ASPECT RATIO CODE#
$ convert sq.jpg -resize 200x200 -background skyblue -gravity center -extent 200x200 scaled-sq-im.jpgīuilding on Alexander-Reynolds answer above, here is the code that handles all possible sizes and situations. $ convert h.jpg -resize 200x200 -background skyblue -gravity center -extent 200x200 scaled-h-im.jpg $ convert v.jpg -resize 200x200 -background skyblue -gravity center -extent 200x200 scaled-v-im.jpg See here for descriptions of the resizing commands. It's very easy to do what you want with a single command. ImageMagick is a simple, but well-built command-line interface to do basic image processing. Sq_img = cv2.imread('sq.jpg') # square image H_img = cv2.imread('h.jpg') # horizontal image V_img = cv2.imread('v.jpg') # vertical image Scaled_img = cv2.copyMakeBorder(scaled_img, pad_top, pad_bot, pad_left, pad_right, borderType=cv2.BORDER_CONSTANT, value=padColor)


Scaled_img = cv2.resize(img, (new_w, new_h), interpolation=interp) If len(img.shape) is 3 and not isinstance(padColor, (list, tuple, np.ndarray)): # color image but only one color provided Pad_left, pad_right, pad_top, pad_bot = 0, 0, 0, 0 Pad_left, pad_right = np.floor(pad_horz).astype(int), np.ceil(pad_horz).astype(int) New_w = np.round(new_h*aspect).astype(int)

Pad_top, pad_bot = np.floor(pad_vert).astype(int), np.ceil(pad_vert).astype(int) New_h = np.round(new_w/aspect).astype(int) So, after resizing we'll end up with a 1000xN or Nx1000 image (where N sh or w > sw: # shrinking imageĪspect = w/h # if on Python 2, you might need to cast as a float: float(w)/h To shrink an image, it will generally look best with CV_INTER_AREA interpolation, whereas to enlarge an image, it will generally look best with CV_INTER_CUBIC (slow) or CV_INTER_LINEAR (faster but still looks OK). Note that if aspect is greater than 1, then the image is oriented horizontally, while if it's less than 1, the image is oriented vertically (and is square if aspect = 1).ĭifferent interpolation methods will look better depending on whether you're stretching the image to a larger resolution, or scaling it down to a lower resolution. So the most robust way to do this is to find the aspect ratio and calculate what the smaller dimension would be when the bigger one is stretched to 1000. However, resize() requires that you put in either the destination size (in both dimensions) or the scaling (in both dimensions), so you can't just put one or the other in for 1000 and let it calculate the other for you. You can use resize() in OpenCV to resize the image up/down to the size you need.
