图片偏转分为两种,一种是无损偏转,另一种是普通偏转
代码:
public static void main(String[] args) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
System.out.println("加载64位的opencv成功!");
Mat srcImage = imread("F:\\test\\1.jpg");
// 参数可以指定0到360度。水平旋转就是180度,垂直旋转是90度或者270度
Mat dstImage = ImageHelper.RotateNew_bak(srcImage, 8);
// angle:向左偏是1到180度,向右偏是-1到-180度
Mat dstImage2 = ImageHelper.RotateNew(srcImage, -8);
imwrite("F:\\test\\1-dstImage.jpg", dstImage);
imwrite("F:\\test\\1-dstImage2.jpg", dstImage2);
}
/**
* 参数可以指定0到360度。水平旋转就是180度,垂直旋转是90度或者270度
* @param srcMat
* @param angel
* @return
*/
public static Mat RotateNew_bak(Mat srcMat, double angel) {
BufferedImage src = ImageDeskew.mat2BufferedImage(srcMat);
int src_width = src.getWidth(null);
int src_height = src.getHeight(null);
// 计算旋转后图片的尺寸
Rectangle rect_des = CalcRotatedSize(new Rectangle(new Dimension(src_width, src_height)), (int) angel);
BufferedImage res = null;
res = new BufferedImage(rect_des.width, rect_des.height, src.getType());
Graphics2D g2 = res.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
g2.setColor(Color.WHITE);
g2.fillRect(0, 0, rect_des.width, rect_des.height);
// 进行转换
g2.translate((rect_des.width - src_width) / 2, (rect_des.height - src_height) / 2);
g2.rotate(Math.toRadians(angel), src_width / 2, src_height / 2);
g2.drawImage(src, null, null);
g2.dispose();
byte[] pixels = ( (DataBufferByte) res.getRaster().getDataBuffer()).getData();
// Create a Matrix the same size of image
Mat I = new Mat(res.getHeight(), res.getWidth(), CvType.CV_8UC3);
// Fill Matrix with image values
I.put(0, 0, pixels);
return I;
}
/**
* angel:左偏是1到180度,向右偏是-1到-180度
* @param srcMat
* @param angel
* @return
*/
public static Mat RotateNew(Mat srcMat, double angel) {
Mat dst = srcMat.clone();
Point center = new Point(srcMat.width()/2.0,srcMat.height()/2.0);
Mat mat1 = Imgproc.getRotationMatrix2D(center, angel, 1.0);
Imgproc.warpAffine(srcMat,dst,mat1,dst.size(),Imgproc.INTER_NEAREST,BORDER_CONSTANT,new Scalar(255,255,255));
mat1 = null;
center = null;
return dst;
}
效果: