关于MFC 下图像旋转的源程序

关于MFC 下图像旋转的源程序,第1张

void SCALE_DrawRotate(HDC hdc) //旋转画点的范例,所有旋转都参考以下坐标旋转的矩阵方程处理即可

{

extern int curRotate; //当前旋转角度,0~360°

if(!bScaled) return;

POINT c; cx = 57; cy = 14; int r = 13; double fr = r-1;

SelectObject(hdc, hBk);

Ellipse(hdc, cx - r, cy - r, cx + r, cy + r);

POINT a[3]; memset(&a, 0, sizeof(c) 3);

const float pi = 3141592653589793238462650288f;

double angle = pi curRotate / 1800f; double s=00f;

s = cx + sin(angle) fr; a[0]x = (int)s;

s = cy - cos(angle) fr; a[0]y = (int)s;

s = cx - sin(angle + pi / 60f) fr; a[1]x = (int)s;

s = cy + cos(angle + pi / 60f) fr; a[1]y = (int)s;

s = cx - sin(angle) fr / 20f; a[2]x = (int)s;

s = cy + cos(angle) fr / 20f; a[2]y = (int)s;

Polygon(hdc, a, 3); cx ++;

s = cx + sin(angle) fr; a[0]x = (int)s;

s = cy - cos(angle) fr; a[0]y = (int)s;

s = cx + sin(angle + pi - pi / 60f) fr; a[1]x = (int)s;

s = cy - cos(angle + pi - pi / 60f) fr; a[1]y = (int)s;

s = cx - sin(angle) fr / 20f; a[2]x = (int)s;

s = cy + cos(angle) fr / 20f; a[2]y = (int)s;

SelectObject(hdc, hBlack);

Polygon(hdc, a, 3);

}//end SCALE_DrawRotate

import javaappletApplet;

import javaawtGraphics;

import javaawtColor;

public class LX3_3 extends Applet {

public void paint(Graphics g) {

gsetColor(Colorred);//设置红颜色

gdrawOval(35,35,100,60);//画椭圆(圆心、宽和高)

gfillOval(200,15,60,100);//画具有填充色的圆

gsetColor(Colorblue);//设置蓝颜色

gdrawRect(20,130,80,80);//画矩形

gfillRect(120,130,80,80);//画具有填充色的矩形

gdrawRoundRect(220,130,80,80,20,20);//画圆角矩形

gfillRoundRect(320,130,80,80,20,20);//画具有填充色的 圆角矩形

}

}

该程序是在Myeclipse的环境下运行的

在二维平面内,画长方形等都只需要改变点的坐标即可实现平移,旋转,缩放

上面还加入了颜色,可供参考

水平有限,但希望对你有帮助

WINDOWS图像编程

--------------------------------------------------------------------------------

图形设备接口(GDI,Graphics Device Interface)的主要目标之一是支持在输出设备(如视频显示器、打印机和绘图仪)上的与设备无关的图形。 GDI通过将应用程序与不同输出设备特性相隔离,使Windows应用程序能够毫无问题地在Windows支持的任何图形输出设备上运行。

Windows中的图形基本上是由从GDI.EXE模块中输出的函数处理的(尽管一些绘制函数实际上具有USER.EXE的入口点),GDI.EXE模块调用在不同驱动程序文件中的例程,其中有一个.DRV驱动程序文件用于控制显示屏幕,并且可能有一个或多个其他的.DRV驱动程序文件用来控制打印机或绘图仪。

Windows GDI使用两种坐标系统。使用虚拟坐标系统可以使程序不依赖于具体的硬件,使用设备坐标系统可以使程序和硬件紧密相联。

GDI含有在Windows应用程序内部执行、且与设备无关的图形 *** 作函数,这些函数可产生各种各样的线、正文和位图,它们可以输出到许多不同的输出设备上。GDI允许一个应用程序产生笔、刷子、字体和位图,以供特定的输出 *** 作使用。下面列出GDI中几组比较常用的函数:

·设备上下文函数

·椭圆和多边形函数

·绘图工具函数

·位图函数

·绘图属性函数

·正文函救

·映射函数。

·坐标函数

·元文件(metafile)函数

·区域函数

·裁剪(clipping)函数·

窗口应用程序输出图形的 *** 作步骤如下:

①取得指定窗口的当前显示设备上下丈,显示设备上下文实际上是一个数据结构,它包括该窗口的参数及各种图形、文字属性的现行设定值,它们对以后的图形、文字输 出命令起控制作用。

②选择用户坐标系及映射方式。

③设定用户坐标系中的观察窗口和设备坐标系中的显示视区。

④输出图形、文字和图象。

⑤释放所使用的显示设备上下文。

当想要在图形输出设备(例如屏幕或打印机)上绘制图形时,必须首先获得设备上下文的句柄。先给出这个句柄,Windows才允许程序使用设备,在GDI函数中将句柄作为一个参数传入,向Windows标明需要使用的设备。

设备上下文中包含许多属性,当GDI在不同的设备上工作时都要用到这些属性。使用这些属性可使GDI只关心起始和终止坐标的大小,而不必关心有关对象的其他属性,如颜色、背景等等,因为这些都是设备上下文的一部分。当需要修改这些属性时,只需调用一个修改设备上下文中属性的参数,以后的程序中都使用修改后的设备上下文属性。设备上下文是连接Windows应用程序、设备驱动程序以及输出设备的纽带。

获取设备上下文句柄有多种方法。最一般的方法是当处理一条消息时获得了设备上下文、并在退出窗口之前释放它。一般的处理方法如下:

在处理WM_PAINT消息时

case WM_PAINT:

hdc=BeginPaint(hwnd,&ps)

EndPaint (hwnd,&ps);

其数据结构为:

HDC hWnd;

PAINTSTRUCT ps;

而在windows.h中定义了PAINTSTRUCT的数据结构。

type struct tagPAINTSTRUCT {

HDC hdC;

BOOL fErase;

RECT rcPaint;

BOOL fRestore;

BOOL flncUpdate;

BYTE rgbReserved[16];

}PAINTSTRUCT;

其中,hdc用于标识显式上下文,fErase指出背景是否重画,rcPaint是涂色矩形,其余的域均为保留。这里的hdc是BeginPaint返回的设备上下文句柄,有了从DeginPaint获取的设备上下文句柄,就可以也只能在ps指出的rcPaint的矩形内绘图,EndPaint调用使这一区域有效。

第二种方法如下所示,使用这种方法获取和释放设备上下文可以在整个用户区内画图,图形在整个用户区域内都有效:

hdC=GetDc (hwnd );

…画图 *** 作…

ReleaseDC (hwnd , hdc );

使用下面第三种方法获取和释放设备上下文,可以在整个窗口内画图,图形在整个窗口内有效:

hdC=GetWindowDc(hwnd);

…画图 *** 作…

ReleaseDc(hwnd,hdc);

使用下面第四种方法获取和释放设备上下文,可以在整个显示器区域内画图,图形在整个显示器区域内部有效:

hdc=CreateDC (lpszDriver ,lpszDevice ,lpszOutput , lpData);

…画图 *** 作…

ReleaseDC(hdc);

其中lpszDriver指向设备驱动程序的DOS文件名(不带扩展名),lpszDevice指向专用设备名(例如Epson Fx-80),lpszOutput指向物理输出介质(文件或输出端口)的DOS文件名或设备名,lpData指向含有设备驱动程序的设备专用的初始化数据的DEVMODE数据结构。例如:

hdc=CreateDC("DISPLAY",NULL,NULL,NULL);

使用屏幕画图,而:

hdc= CreateDC ("IBMGRX","IBM Graphics","LPT1",NULL );

在打印机上输出图形,这里的lpData置为默认值,可以在WIN.INI中找到初始化值。

如果不需要获取设备上下文,即不需要在设备上下文中 *** 作,只需了解有关设备上下文的信息,可以用如下语句:

hdcInfo = CreateDC (lpszDriver, lpszDevice,lpszOutput, lpData );

……

DeteteDC (hdcInfo);

另外,还可以使用设备上下文来对位图的内存进行控制,如下所示:

hdcMem = CreateCompatibleDC (hdc)

OeleteDc(hdcMem );

一个元文件是以二进制形式编码的GDI调用集合,可通过获取一个元文件设备上下文来建立一个文件:

hdcMeta=CreateMetaFile(lpszFilename);

……

hmf=CloseMetaFile(hdCMeta);

在元文件设备上下文有效期间,使用hdcMeta所进行的任何GDI调用都成为元文件的一部分,当调用CloseMetaFile时,设备上下文句柄变化无效,函数返回元文件(hmf)的句柄。

一个设备上下文通常涉及物理设备,如视频显示器、打印机等,所以需要获取有关该设备的信息,如显示器大小和彩色能力等。可以通过调用GetDeviceCaps函数来获取这样的信息:

nValue=GetDeviceCaps (hdc,nIndex);

这里的hdc标识设备上下文,nIndex确定返回值,它可以是window.h中所定义的28个标识符中的一个,例如nIndex=DRIVEVERSION,则该函数返回的是版本号。

真正影响在用户区域上绘制过程的设备上下文属性是“映射方式”,与映射方式属性密切相关的还有如下四个设备上下义属性:窗口原点、视窗原点、窗口范围和视窗范围。

Windows定义了八种映射方式,即:

这里的TWIP指的是1/1440英寸,in.代表英寸。

可以调用函数setMapMode(hdc,MapMode)来设置这八种映射方式中的一种。hdc用来标识设备上下文,nMapMode可以取MM_TEXT、MM_LOMETRIC、MM_HIMETRIC等八个值中的一个。在设置了映射方式之后,到下一次设置映射方式之前,Windows一直使用这种映射方式。如果想要获取当前的映射方式,可用:

nMapMode= GetMapMode (hdc)

在设置了映射方式之后,就规定了逻辑单位的大小和增量的方式,在GDI画图函数中,可以不必考虑这些内容而直接使用逻辑数字,如:

SetMapMode(hdc ,MM_TEXT);

TextOut(hdc,8 ,16,szBuffer ,nLength)

即正文从用户区域左起第八个象素,顶边起第16个象素的位置开始写 *** 作。不管映射方式如何,Windows函数中所有坐标规定为-32768 到 32767之间的带符号短整救。

注意映射方式只是一个设备上下文属性,因此映射方式唯一起作用的是将映射方式作为设备上下文句柄属性,而将该句柄当作参数的GDI函数,因此象GetSystemMetrics这样的非GDI函数,将继续以设备单位(象素值)返回尺寸值。

用GDI的SetPixel函数可以绘制一特定颜色的象素:

rgbActualColor =SetPixel (hdc,x,y,rgbColor);

这里hdc标识设备上下文,x ,y表示点坐标,rgbColor为一无符号的长整数,其结构为:

COLORREF rgbColor;

其中低位字节为红基色的相对亮度值,第二个字节包含绿基色的相对亮度值,第三个字节包含蓝基色的相对亮度值,高位字节必须为零。可以使用RGB函数来获取rgbColor。

rgbColor =RGB(byRed ,byGreen,byBlue);

这里的byRed、byGreen、byBlue取值范围为0~255,分别代表红色、绿色、蓝色的亮度。给出正确的参数之后,SetPixel返回的是调色板中最靠近所需彩色的颜色。还可以使用如下方法来取得一个特定象素的颜色:

rgbCotor= GetPixel(hdc,x,y);

画线函数主要有三种, LineTo、Polyline 和 Arc。还有五个设备上下文属性会影响这些函数画出的线的外观:笔的当前位置(仅对LineTo有影响)、笔、背景方式(对非实心笔有影响)、背景颜色(对 OPAQUE背景方式)以及绘制方式。

在这些设备上下文的属性中,笔的当前位置影响画线的起点,笔影响线的粗细等形状,背景方式影响非实心笔画出的线的模板图形,背景颜色影响线模板背景色,绘制方式影响实心线、虚线等线属性。

以下是典型的画线 *** 作步骤:

MoveTo(hdc,xStart,yStart);

LineTo(hdc ,xEnd ,yEnd);

上面两句画出一条从(xStart,yStart)到(xEnd,yEnd)的直线。

可以使用语句:

dwPoint = GetCurrentPosition (hdc);

获得笔的当前位置。这里,dwPoint返回值是一个无符号长整数(或双倍长字),其中低位字含有X坐标,高位字含有Y坐标。

可以使用MAKEPOINT函数将dwPoint转换为POINT结构;

point = MAKEPOINT (dwPoint);

point的类型为POINT:

typedef struct togPOINT {kk1}

int x;

int y;

}POINT;

Polyline用于绘制折线,例:

Polyline(hdc,&pt,5)

将数组pt中的5个点之间用线段相连。

Arc用于画椭圆的周边:

Arc (hdc,xLeft,yTop,xRight,yBottom,xStart,yStart,XEnd,yEnd );

画出的椭圆以左上角为(xLeft,yTop),右下角为(xRight,yBottom)的矩形为界,圆弧开始于椭圆和(xStart,yStart)与椭圆中心的连线的交点处,沿着椭圆周边的过时针方向绘制,并终止于椭圆和(xEnd,yEnd)与椭圆中小的连线的交点处。

当调用LineTo、Polyline和Arc时,Windows使用当前在设备上下文中选择的笔来画线,笔决定了线的颜色、密度和型式,而线型可以是实线、点线或短划(虚)线,缺省设备上下文中的笔叫做BLACK_PEN,不管映射方式如何选支笔以一个象素的宽度画黑色的实线, BLACK_PEN是Windows提供的三支“备用笔”之一,其他两支是WHITE_PEN和NULL_PEN,NULL_PEN是一支什么都不画的空笔,当然用户也可以自己建立定制的笔。

可以通过一个句柄来引用所需的笔:

HPEN hPen;

hPen =GetStockObject(WHITE_PEN);

SelectObjeCt (hdc ,hPen) ;

SelectObject (hdc , hBrush ) ;

将逻辑刷送入设备上下文中。如果使用结束,可以用:

DeletObject (hBrush ) ;

删除一把已建立的刷子,如果在程序中需要获取有关于刷子的信息,则可以调用:

3.像素格式结构

每个OpenGL显示设备都支持一种指定的像素格式。一般用一个名为PIXELFORMATDESCRIPTOR的结构来表示某个特殊的像素格式,这个结构包含26个属性信息。Win32定义PIXELFORMATDESCRIPTOR如下所示:

typedef struct tagPIXELFORMATDESCRIPTOR

{ kk1}

// pfd

WORD nSize;

WORD nVersion;

DWORD dwFlags;

BYTE iPixelType;

BYTE cColorBits;

BYTE cRedBits;

BYTE cRedShift;

BYTE cGreenBits;

BYTE cGreenShift;

BYTE cBlueBits;

BYTE cBlueShift;

BYTE cAlphaBits;

BYTE cAlphaShift;

BYTE cAccumBits;

BYTE cAccumRedBits;

BYTE cAccumGreenBits;

BYTE cAccumBlueBits;

BYTE cAccumAlphaBits;

BYTE cDepthBits;

BYTE cStencilBits;

BYTE cAuxBuffers;

BYTE iLayerType;

BYTE bReserved;

DWORD dwLayerMask;

DWORD dwVisibleMask;

DWORD dwDamageMask;

} PIXELFORMATDESCRIPTOR;

4.初始化PIXELFORMATDESCRIPTOR结构

PIXELFORMATDESCRIPTOR中每个变量值的具体含义和设置可以参考有关资料,下面举出一个PIXELFORMATDESCRIPTOR初始化例子来简要说明相关变量的意义。定义PIXELFORMATDESCRIPTOR结构的pfd如下:

PIXELFORMATDESCRIPTOR pfd = { kk1}

sizeof(PIXELFORMATDESCRIPTOR), //size of this pfd 1

PFD_DRAW_TO_WINDOW| // support window

PFD_SUPPORT_OPENGL| // support OpenGL

PFD_DOUBLEBUFFER, // double buffered

PFD_TYPE_RGBA, // RGBA type

24, // 24-bit color depth

0,0,0,0,0,0, // color bits ignored

0, // no alpha buffer

0, // shift bit ignored

0, // no accumulation buff

0,0,0,0, // accum bits ignored

32, // 32-bit z-buffer

0, // no stencil buffer

0, // no auxiliary buffer

PFD_MAIN_PLANE, // main layer

0, // reserved

0,0,0 // layer masks ignored

};

在这个结构里,前两个变量的含义十分明显。第三个变量dwFlags的值是

PFD_DRAW_TO_WINDOW |PFD_SUPPORT_OPENGL ,

表明应用程序使用OpenGL函数来绘制窗口

第四个:

PFD_DOUBLEBUFFER,

表明当前采用RGBA颜色模式,第五个采用24位真彩色,既1.67千万种颜色,如果是256色系统则自动实现颜色抖动;因为没有使用alpha缓存和累计缓存,所以从变量cAlphaBits到cAccumAlphaBits都设置为0;深度缓存设置为32位,这个缓存能解决三维场景的消隐问题;变量cAuxBuffers设置为0,在Windows 95下不支持辅助缓存;Windows 95下针对OpenGL变量ilayerType只能设置为PFD_MAIN_PLANE,但在其它平台也许支持PFD_MAIN_PLANE或PFD_MAIN_UNDERLAYPLANE;接下来bReserved变量只能设为0,而最后三个变量Windows 95都不支持,故全设置为0

每个数控系统代码不是完全相同的,以广州数控为例快速定位(G00或G0)刀具以点位控制方式从当前所在位置快速移动到指令给出的目标位置。指令格式:G00X(U)Z(W);(2)直线插补(G01或G1)指令格式:G01X(U)Z(W)F;G02顺时针圆弧插补G03逆时针圆弧插补G04停顿G17选择XY平面G18选择XZ平面G19选择YZ平面G20英制G21公制G28返回参考点G29返回第二参考点G30跳步功能G40取消刀具半径补偿G41刀具半径左补偿G42刀具半径右补偿G43刀具长度补偿G49取消刀具长度补偿G50取消比例缩放功能G51比例缩放功能G511镜像G501取消镜像G53选择机床坐标系G54选择第一工件坐标系G55选择第二工件坐标系G56选择第三工件坐标系G57选择第四工件坐标系G58选择第五工件坐标系G59选择第六工件坐标系G65宏程序及宏程序调用G68坐标旋转指令G69坐标旋转指令取消G70精加工循环G72端面车削固定循环G73深孔钻削循环G74攻螺纹循环G80取消钻孔模式G81钻孔G83啄钻G84攻丝G90绝对坐标G91相对坐标G92设定工件坐标系M00暂停M01选择性暂停M02程序结束M30程序结束并返回程序头M03启动主轴转速M04主轴停止M05主轴停转M06+T换刀M08切削液开M09切削液关M19主轴定位M98调子程序M99子程序结束以上都是比较常用的,还有一些不常用的,你再看看说明书吧,至于注意事项就是 *** 作是注意安全,看熟 *** 作说明书吧!希望能帮到你!

又是你,哈哈哈,我把放大和翻转都给你粘出来吧,代码如下:

package gui;

import javaawtBorderLayout;

import javaawtGraphics2D;

import javaawtImage;

import javaawtRenderingHints;

import javaawtToolkit;

import javaawteventActionEvent;

import javaawteventActionListener;

import javaawtimageBufferedImage;

import javaxswingImageIcon;

import javaxswingJButton;

import javaxswingJFrame;

import javaxswingJLabel;

import javaxswingJPanel;

public class Bean extends JFrame implements ActionListener {

 JPanel jPanel;

 JLabel jLabel;

 Image image;

 ImageIcon imageIcon;

 JButton jButton;

 JButton jButton1;

 int w;

 int h;

 int f;

 public Bean() {

  super("");

  jButton = new JButton("变大");

  jButton1 = new JButton("反转");

  jButtonaddActionListener(this);

  jButton1addActionListener(this);

  image = ToolkitgetDefaultToolkit()getImage("src/img1jpg");

  jLabel = new JLabel();

  jPanel = new JPanel();

  ImageIcon imageIcon = new ImageIcon(image);

  jLabelsetIcon(imageIcon);

  jPaneladd(jLabel);

  w = imagegetWidth(jLabel);

  h = imagegetHeight(jLabel);

  thisadd(jPanel, BorderLayoutNORTH);

  thisadd(jButton, BorderLayoutSOUTH);

  thisadd(jButton1, BorderLayoutEAST);

  thissetVisible(true);

  thissetSize(600, 600);

 }

 public static void main(String[] args) {

  new Bean();

 }

 public void big() {

  w += 20;

  h += 20;

  BufferedImage bffimage = new BufferedImage(w, h,

    BufferedImageTYPE_3BYTE_BGR);

  // 把读到bufferedImage中

  bffimagegetGraphics()drawImage(image, 0, 0, w, h, null);

  // 得到转换后的Image

  Image realImage = bffimage;

  // 可以把转化为ImageIcon,(Swing中运用)

  ImageIcon img = new ImageIcon(realImage);

  jLabelsetIcon(img);

 }

 

 public void fz() {

  BufferedImage bffimage = new BufferedImage(w, h,

    BufferedImageTYPE_3BYTE_BGR);

  // 把读到bufferedImage中

  bffimagegetGraphics()drawImage(image, 0, 0, w, h, null);

  f+=45;

  // 得到转换后的Image

  bffimage=rotateImage(bffimage, f);

  Image realImage = bffimage;

  // 可以把转化为ImageIcon,(Swing中运用)

  ImageIcon img = new ImageIcon(realImage);

  jLabelsetIcon(img);

 }

 

 public void actionPerformed(ActionEvent e) {

  if (egetSource() == jButton) {

   big();

  }

  if (egetSource() == jButton1) {

   fz();

  }

 }

 /

   旋转为指定角度

   

   @param bufferedimage

              目标图像

   @param degree

              旋转角度

   @return

  /

 public static BufferedImage rotateImage(final BufferedImage bufferedimage,

   final int degree) {

  int w = bufferedimagegetWidth();

  int h = bufferedimagegetHeight();

  int type = bufferedimagegetColorModel()getTransparency();

  BufferedImage img;

  Graphics2D graphics2d;

  (graphics2d = (img = new BufferedImage(w, h, type))createGraphics())

    setRenderingHint(RenderingHintsKEY_INTERPOLATION,

      RenderingHintsVALUE_INTERPOLATION_BILINEAR);

  graphics2drotate(MathtoRadians(degree), w / 2, h / 2);

  graphics2ddrawImage(bufferedimage, 0, 0, null);

  graphics2ddispose();

  return img;

 }

}

以上就是关于关于MFC 下图像旋转的源程序全部的内容,包括:关于MFC 下图像旋转的源程序、如何用java写矩形平移和旋转后输出坐标的代码、用编程语言实现一个正方形360°旋转 下面是我写的一个画正方形的代码! 我想要的是算法。要求完整代码。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9713689.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存