`

图像旋转

 
阅读更多

例子:Snippet139

 

public class Snippet139 {	

static ImageData rotate(ImageData srcData, int direction) {
	int bytesPerPixel = srcData.bytesPerLine / srcData.width;
	int destBytesPerLine = (direction == SWT.DOWN)? srcData.width * bytesPerPixel : srcData.height * bytesPerPixel;
	byte[] newData = new byte[(direction == SWT.DOWN)? srcData.height * destBytesPerLine : srcData.width * destBytesPerLine];
	int width = 0, height = 0;
	for (int srcY = 0; srcY < srcData.height; srcY++) {
		for (int srcX = 0; srcX < srcData.width; srcX++) {
			int destX = 0, destY = 0, destIndex = 0, srcIndex = 0;
			switch (direction){
				case SWT.LEFT: // left 90 degrees
					destX = srcY;
					destY = srcData.width - srcX - 1;
					width = srcData.height;
					height = srcData.width; 
					break;
				case SWT.RIGHT: // right 90 degrees
					destX = srcData.height - srcY - 1;
					destY = srcX;
					width = srcData.height;
					height = srcData.width; 
					break;
				case SWT.DOWN: // 180 degrees
					destX = srcData.width - srcX - 1;
					destY = srcData.height - srcY - 1;
					width = srcData.width;
					height = srcData.height; 
					break;
			}
			destIndex = (destY * destBytesPerLine) + (destX * bytesPerPixel);
			srcIndex = (srcY * srcData.bytesPerLine) + (srcX * bytesPerPixel);
			System.arraycopy(srcData.data, srcIndex, newData, destIndex, bytesPerPixel);
		}
	}
	// destBytesPerLine is used as scanlinePad to ensure that no padding is required
	return new ImageData(width, height, srcData.depth, srcData.palette, srcData.scanlinePad, newData);
}
static ImageData flip(ImageData srcData, boolean vertical) {
	int bytesPerPixel = srcData.bytesPerLine / srcData.width;
	int destBytesPerLine = srcData.width * bytesPerPixel;
	byte[] newData = new byte[srcData.data.length];
	for (int srcY = 0; srcY < srcData.height; srcY++) {
		for (int srcX = 0; srcX < srcData.width; srcX++) {
			int destX = 0, destY = 0, destIndex = 0, srcIndex = 0;
			if (vertical){
				destX = srcX;
				destY = srcData.height - srcY - 1;
			} else {
				destX = srcData.width - srcX - 1;
				destY = srcY; 
			}
			destIndex = (destY * destBytesPerLine) + (destX * bytesPerPixel);
			srcIndex = (srcY * srcData.bytesPerLine) + (srcX * bytesPerPixel);
			System.arraycopy(srcData.data, srcIndex, newData, destIndex, bytesPerPixel);
		}
	}
	// destBytesPerLine is used as scanlinePad to ensure that no padding is required
	return new ImageData(srcData.width, srcData.height, srcData.depth, srcData.palette, srcData.scanlinePad, newData);
}

public static void main(String[] args) {
	Display display = new Display();
	
	// create an image with the word "hello" on it
	final Image image0 = new Image(display, 50, 30);
	GC gc = new GC(image0);
	gc.setBackground(display.getSystemColor(SWT.COLOR_RED));
	gc.fillRectangle(image0.getBounds());
	gc.drawString("hello",	5, 5, true);
	gc.dispose();
	
	ImageData data = image0.getImageData();
	// rotate and flip this image
	final Image image1 = new Image(display, rotate(data, SWT.LEFT));
	final Image image2 = new Image(display, rotate(data, SWT.RIGHT));
	final Image image3 = new Image(display, rotate(data, SWT.DOWN));
	final Image image4 = new Image(display, flip(data, true));
	final Image image5 = new Image(display, flip(data, false));

	Shell shell = new Shell(display);
	// draw the results on the shell
	shell.addPaintListener(new PaintListener(){
		public void paintControl(PaintEvent e) {
			e.gc.drawText("Original Image:", 10, 10, true);
			e.gc.drawImage(image0, 10, 40);
			e.gc.drawText("Left, Right, 180:", 10, 80, true);
			e.gc.drawImage(image1, 10, 110);
			e.gc.drawImage(image2, 50, 110);
			e.gc.drawImage(image3, 90, 110);
			e.gc.drawText("Flipped Vertical, Horizontal:", 10, 170, true);
			e.gc.drawImage(image4, 10, 200);
			e.gc.drawImage(image5, 70, 200);
		}
	});
	shell.setSize(300, 300);
	shell.open();
	while (!shell.isDisposed()) {
		if (!display.readAndDispatch())
			display.sleep();
	}
	image0.dispose();
	image1.dispose();
	image2.dispose();
	image3.dispose();
	image4.dispose();
	image5.dispose();
	display.dispose();
}
}

 

 



 

 

  • 大小: 8.8 KB
分享到:
评论

相关推荐

    图片旋转 CCD_CCD如何旋转_图片旋转的dll_visionpro联合C#实现图像旋转_

    在图像处理领域,图片旋转是一项基础且重要的操作。在标题“图片旋转 CCD_CCD如何旋转_图片旋转的dll_visionpro联合C#实现图像旋转_”中,涉及到的关键技术包括CCD(Charge-Coupled Device)相机的工作原理,以及...

    Verilog大作业图像旋转

    在本大作业中,我们将使用 Verilog 语言来实现图像旋转90度,并使用 C++ 语言读取图片和生成旋转后的图片。 图像旋转的需求分析 在图像处理领域中,图像旋转是一个非常重要的操作。旋转图像可以帮助我们更好地...

    OpenCvSharp图片旋转.zip

    图片旋转是通过`Rotate`方法实现的。该方法接受一个`RotationFlags`枚举值作为参数,表示旋转方向。以下是一些常见的旋转操作: 1. **左旋转90°**: 使用`RotationFlags.Rotate90Clockwise`,表示顺时针旋转90度...

    delphi基于gdi+的图片旋转任意角度

    标题中的“delphi基于gdi+的图片旋转任意角度”是指使用Delphi编程语言结合GDI+库来实现图像的任意角度旋转功能。GDI+是Microsoft提供的图形设备接口,它扩展了传统的GDI(图形设备接口),增加了对矢量图形、图像...

    图像旋转的代码 自己编的

    在图像处理领域,旋转变换是一种常见的操作,用于改变图像的方向或角度。在这个主题中,我们将深入探讨如何实现图像的旋转代码,以及涉及到的关键技术点。 图像旋转主要分为两种类型:仿射变换和平移变换。这里提到...

    双线性插值算法实现图像旋转

    ### 双线性插值算法实现图像旋转 #### 核心知识点 1. **双线性插值原理** 2. **图像旋转基本概念** 3. **实现细节:坐标变换与像素值估算** #### 双线性插值原理 双线性插值是一种用于图像处理中的重采样技术,...

    Python+OpenCV 实现图片无损旋转90°且无黑边

    传统的图片旋转是通过简单地改变图片的像素来实现的,但由于旋转后图片的尺寸变化,通常会使得原始图片的边缘部分超出新图像的边界,形成黑边。为了解决这个问题,我们需要在旋转图片后,找到新图像中非黑边的部分,...

    图片旋转 任意角度 图象 算法

    图片旋转是计算机图形学中的一个常见任务,尤其在图像处理和多媒体应用中。这个压缩包提供的资源似乎包含了一个动态链接库(DLL)和相应的源代码,用于实现图像任意角度旋转的功能,并且支持多种编程语言,如C、C++...

    关于旋转图片会丢失四角的解决办法

    在图像处理领域,尤其是使用Halcon这种专业机器视觉软件时,可能会遇到图片旋转后四角丢失的问题。这通常是由于图片旋转操作导致的像素裁剪。本文将深入探讨这个问题,并提供有效的解决方案。 首先,理解问题的根源...

    一个非常精彩的图像旋转控件(delphi)

    在Delphi编程环境中,开发一款图像旋转控件是一项常见的任务,尤其对于那些涉及到图像处理的软件。本控件,名为“rotateimage.v1.4”,显然专注于提供图像旋转功能,使得用户可以方便地对图像进行角度调整。这个控件...

    Halcon图像旋转不被剪切

    Halcon图像旋转不被剪切,分为单通道图像和三通道彩色图像;将原始图像放在最小外接圆的外接正方形的画布上,中心对中心的仿射变换使原始图像无论怎么旋转都不会被窗口剪切

    C++实现旋转图像

    在C++编程中,图像处理是一项常见的任务,其中包括旋转图像这一功能。本篇文章将深入探讨如何使用C++来实现图像的旋转操作。首先,我们需要理解图像旋转的基本原理,然后介绍必要的库函数,最后通过示例代码展示具体...

    基于MATLAB的图像旋转,可以指定任意一个旋转轴,旋转任意角度

    基于MATLAB的图像旋转,可以设定任意旋转轴,包括常见的X轴,Y轴,Z轴旋转,可以旋转任意角度,代码具有通用性,操作方便,可以扩展,旋转的核心部分已经写成函数,可以被调用,可以用于图像旋转展示,以及其他需要...

    基于VC的图像旋转源码

    ### 基于VC的图像旋转源码解析 #### 一、概述 本文将深入解析一个基于Visual C++(简称VC)实现的图像旋转功能。该功能的核心是通过旋转DIB(Device Independent Bitmap,设备独立位图)图像,并在旋转过程中采用...

    旋转图片C#,使图片旋转

    综上所述,要实现“旋转图片C#,使图片旋转”的功能,开发者需要掌握C#的图像处理库,理解旋转算法和几何变换,以及如何在.NET Framework中操作Bitmap和Graphics对象。通过编写代码,将这些知识点融合在一起,即可...

    图像旋转公式(坐标的旋转公式)

    图像旋转是计算机图形学中的一个基本操作,广泛应用于图像处理、计算机视觉以及游戏开发等领域。在二维平面上,我们可以通过坐标变换来实现图像的旋转。这里我们主要讨论的是围绕原点进行旋转的情况。 首先,我们要...

    C语言实现二值图像旋转任意角度

    在图像处理领域,旋转图像是一项常见的操作。C语言作为底层编程语言,虽然不像高级语言那样有现成的库函数可以直接调用,但通过手动编写代码,我们仍然可以实现图像的旋转功能,特别是对于二值图像(只有黑色和白色...

    IDL语言实现图像旋转程序

    4. **旋转矩阵**:图像旋转可以用一个2x2的旋转矩阵表示,其中包含旋转角度的信息。旋转矩阵公式为: \[ R = \begin{bmatrix} \cos(\theta) & -\sin(\theta) \\ \sin(\theta) & \cos(\theta) \end{bmatrix} \] ...

    图像旋转的演示程序,提供源代码

    - 结合图形库,可以将旋转功能集成到自己的应用程序中,用于处理图片或显示动态效果。 综上所述,这个图像旋转演示程序和源代码是学习和实践图像处理技术的好材料,特别是对于理解和实现图像旋转的算法有极大的...

    易语言图片旋转

    在这个“易语言图片旋转”主题中,我们将探讨如何使用易语言来处理图像的旋转、翻转等操作。 在计算机图形学中,图像的旋转和翻转是常见的图像处理技术。这些操作通常涉及到矩阵运算和图像像素的重新映射。在易语言...

Global site tag (gtag.js) - Google Analytics