JavaCV:对任意图片进行等比缩放(黑边填充)

测试类

/**
 * 测试类
 * 
 * @author alderaan
 * @version 创建时间:2022年6月15日 上午10:03:14
 *
 */
public class App1
{
	public static void main(String[] args)
	{
		try
		{
			// imageUniformScaleResize图片等比缩放黑边填充函数,
			// 将srcimageurl路径的图片等比缩放后并黑边填充至dstwidth×dstheight大小,
			// 并将结果存储到dstimageurl路径下
			PictureUtil.imageUniformScaleResize("/home/alderaan/1080x1920.jpg", "/data/result.jpg", 400, 800);
		} catch (java.lang.Exception e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("执行完毕!");
	}
}

图片工具类

import static org.bytedeco.opencv.global.opencv_core.BORDER_CONSTANT;
import static org.bytedeco.opencv.global.opencv_core.CV_8UC3;
import static org.bytedeco.opencv.global.opencv_core.copyMakeBorder;
import static org.bytedeco.opencv.global.opencv_imgcodecs.imread;
import static org.bytedeco.opencv.global.opencv_imgcodecs.imwrite;
import static org.bytedeco.opencv.global.opencv_imgproc.resize;

import java.io.FileNotFoundException;

import org.bytedeco.opencv.opencv_core.Mat;
import org.bytedeco.opencv.opencv_core.Scalar;
import org.bytedeco.opencv.opencv_core.Size;
import org.bytedeco.opencv.opencv_core.UMat;

/**
 * 图片工具类
 * 
 * @author alderaan
 * @version 创建时间:2022年6月15日 上午10:02:30
 *
 */
public class PictureUtil
{
	/**
	 * 图片等比缩放函数,将srcimageurl路径的图片等比缩放后并黑边填充至dstwidth×dstheight大小,并将结果存储到dstimageurl路径下
	 * 
	 * @param srcimageurl 原始图片路径
	 * @param dstimageurl 缩放后图片保存路径
	 * @param dstwidth    缩放后图片宽度(不为0)
	 * @param dstheight   缩放后图片高度(不为0)
	 * @throws Exception 异常
	 */
	public static void imageUniformScaleResize(String srcimageurl, String dstimageurl, int dstwidth, int dstheight)
			throws Exception
	{
		if (dstwidth <= 0 || dstheight <= 0)
		{
			throw new Exception("Error! Dst width or height can not be zero!");
		}
		Mat srcimagemat = imread(srcimageurl);
		if (0 == srcimagemat.cols() || 0 == srcimagemat.rows())
		{
			throw new FileNotFoundException("Error! File srcimageurl not found or illegal!");
		}

		UMat srcimage = new UMat(new Size(srcimagemat.cols(), srcimagemat.rows()), CV_8UC3);
		srcimagemat.copyTo(srcimage);

		UMat dstimage_result = new UMat(new Size(dstwidth, dstheight), CV_8UC3);

		uniformScaleResize(srcimage, dstimage_result, dstwidth, dstheight);

		boolean status = imwrite(dstimageurl, dstimage_result);
		if (false == status)
		{
			throw new Exception("Error! Saving file " + dstimageurl + " error! Please check path!");
		}
	}

	private static void uniformScaleResize(UMat srcimage, UMat dstimage_result, int dstwidth, int dstheight)
	{
		int srcwidth = srcimage.cols();
		int srcheight = srcimage.rows();

		int height = (int) (dstwidth * ((float) (srcheight) / srcwidth));
		int width = (int) (dstheight * ((float) (srcwidth) / srcheight));

		UMat dstimage = null;

		if (height <= dstheight)
		{
			dstimage = new UMat(new Size(dstwidth, height), CV_8UC3);
			resize(srcimage, dstimage, new Size(dstwidth, height));
		} else
		{
			dstimage = new UMat(new Size(width, dstheight), CV_8UC3);
			resize(srcimage, dstimage, new Size(width, dstheight));
		}

		int top = (dstheight - dstimage.rows()) / 2;
		int down = (dstheight - dstimage.rows() + 1) / 2;
		int left = (dstwidth - dstimage.cols()) / 2;
		int right = (dstwidth - dstimage.cols() + 1) / 2;

		copyMakeBorder(dstimage, dstimage_result, top, down, left, right, BORDER_CONSTANT, new Scalar(0, 0, 0, 0));

		return;
	}
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值