mfc空间几何变换之图像平移、镜像、旋转、缩放详解

合集下载

二维几何变换学习镜像平移和旋转等变换

二维几何变换学习镜像平移和旋转等变换

二维几何变换学习镜像平移和旋转等变换在几何学中,二维几何变换是一种将平面上的点或形状进行改变的操作。

镜像、平移和旋转是常见的二维几何变换,它们不仅有着广泛的应用,而且在计算机图形学和图像处理等领域中扮演着重要的角色。

本文将分别介绍镜像、平移和旋转等变换的基本概念、性质与应用。

一、镜像变换镜像变换,又称翻转变换,是将平面上的点或形状沿着一条直线进行对称的变换。

在镜像变换中,我们可以定义一条直线作为镜像轴,对于沿轴线的点,它们在镜像后仍保持在轴上,而对于不在轴上的点,则沿垂直于轴线的方向移动相同的距离。

镜像变换可以分为对称镜像和中心镜像两种类型。

对称镜像是将平面上的点或形状沿着一条直线进行对称的变换。

对于对称镜像,镜像轴上的点保持不变,其他点关于轴线对称。

例如,在一个直角三角形中,如果将三角形沿着斜边的中垂线进行对称,那么三角形的形状将完全相同,但位置改变了。

中心镜像是将平面上的点或形状沿着一个点进行对称的变换。

对于中心镜像,镜像中心点保持不变,其他点关于镜像中心对称。

例如,在一个正方形中,如果将正方形沿着中心进行中心镜像,那么正方形的形状将保持不变。

镜像变换在现实生活和工程应用中有着广泛的应用。

例如,在建筑设计中,通过对称镜像可以快速获得相对称的结构,从而减少设计和施工的难度。

在计算机图形学中,镜像变换被广泛应用于图像处理和计算机游戏中,能够快速生成镜像效果。

二、平移变换平移变换是将平面上的点或形状沿着一个方向进行移动的变换。

在平移变换中,每个点的平移距离和方向相同,所有的点都保持相对位置不变。

平移变换可以用坐标表示为(x, y) → (x+dx, y+dy),其中(dx, dy)表示平移的距离和方向。

平移变换的一个重要性质是保持平行性,即平移后的平行线与原先的平行线依然平行。

这个性质在工程设计和计算机图形学中有着重要的应用。

例如,在工程设计中,通过平移变换可以方便地复制和粘贴结构,缩短设计和施工的时间。

几何形的变换和构造平移旋转翻转和镜像的基本操作

几何形的变换和构造平移旋转翻转和镜像的基本操作

几何形的变换和构造平移旋转翻转和镜像的基本操作几何形的变换和构造:平移、旋转、翻转和镜像的基本操作几何形的变换和构造是数学中的重要概念,它们描述了几何形状在平面上或者空间中的移动、旋转、翻转和镜像等操作。

这些操作不仅在数学中有着广泛的应用,还在计算机图形学、工程设计等领域发挥着重要的作用。

本文将介绍几何形的平移、旋转、翻转和镜像的基本操作,并探讨它们的特点和应用。

一、平移平移是指在平面上或者空间中,将一个几何形状沿着指定的方向和距离移动的操作。

在平面上进行平移时,我们可以通过将几何形状的所有点沿着指定的方向移动相同的距离来实现。

在空间中进行平移时,同样可以将几何形状的所有点沿着指定的方向移动相同的距离。

平移的基本特点是保持几何形状的大小、形状和方向不变。

它是一种刚体变换,即在平移的过程中没有发生形状的扭曲或变形。

平移操作常被用于图形的移动、对称等应用中。

二、旋转旋转是指在平面上或者空间中,将一个几何形状绕着某个中心点旋转一定角度的操作。

在平面上进行旋转时,我们可以通过将几何形状的所有点绕着指定的中心点旋转相同的角度来实现。

在空间中进行旋转时,同样可以将几何形状的所有点绕着指定的中心点旋转相同的角度。

旋转的基本特点是保持几何形状的大小和形状不变,但会改变几何形状的朝向或方向。

在旋转的过程中,几何形状的各个点围绕着旋转中心点旋转,并按照一定的规律重新排列。

旋转操作常被应用于图形的变换、建筑物的设计、机械的运动等领域。

三、翻转翻转是指在平面上或者空间中,将一个几何形状沿着某条轴线镜像对称的操作。

在平面上进行翻转时,我们可以通过将几何形状的所有点沿着指定的轴线进行镜像对称来实现。

在空间中进行翻转时,同样可以将几何形状的所有点沿着指定的轴线进行镜像对称。

翻转的基本特点是保持几何形状的大小和形状不变,但会改变几何形状的朝向或方向。

翻转操作将几何形状的各个点关于轴线进行对称,使得原本位于轴线一侧的点反转到轴线的另一侧。

编程实现一幅图像的平移、镜像、旋转、缩小和放大

编程实现一幅图像的平移、镜像、旋转、缩小和放大

课程设计任务书学生姓名:专业班级:通信1003班指导教师:郭志强工作单位:信息工程学院题目: 通信工程应用技术初始条件:(1)使用matlab软件进行操作(2)选择一个图像进行处理要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)(1)编程实现一幅图像的平移、镜像、旋转、缩小和放大。

(2)给出所用算法的理论依据和必要的推导过程,给出原始图像和处理后的图像。

时间安排:第15周:安排任务,布置题目;第15—18周:设计仿真,撰写报告第19周:完成设计,提交报告,答辩指导教师签名:年月日系主任(或责任教师)签名:年月日目录摘要 (I)Abstract ........................................................................................................................................................... I I 1 MA TLAB简介 .. (1)1.1 MA TLAB用途 (1)2图像选择及变换 (4)2.1 原始图像选择读取 (4)2.2 图像放大和缩小 (6)2.2.1 图像放大缩小的知识 (6)2.2.2 函数说明及参数选择 (8)2.2.3 源程序及运行结果 (8)2.3 图像任意角度的旋转 (10)2.3.1 函数说明及参数选择 (10)2.3.2 源程序及运行结果 (10)2.4 图像的平移 (12)2.4.1 函数说明及参数选择 (12)2.4.2 源程序及运行结果 (13)2.5 图像经过镜像 (13)3.5.1 函数说明及参数选择 (13)2.5.2 源程序及运行结果 (14)4 感悟体会小结 (17)5 参考文献 (18)附录 (19)全部源程序代码: (19)摘要MATLAB是—套高性能的数值计算和可视化软件,它集数值分析、矩阵运算、信号处理和图形显示于一体,构成—个方便的、界面友好的用户环境。

编程实现一幅图像的平移、镜像、旋转、缩小和放大。

编程实现一幅图像的平移、镜像、旋转、缩小和放大。

编程实现⼀幅图像的平移、镜像、旋转、缩⼩和放⼤。

课程设计任务书学⽣姓名: zhh 专业班级:通信1002班指导教师:徐⽂君⼯作单位:信息⼯程学院题⽬: 通信⼯程应⽤技术综合训练与实习初始条件:1.数字图像处理课程相关知识。

2.Matlab软件的软件编程应⽤与仿真。

要求完成的主要任务:任务:编程实现⼀幅图像的平移、镜像、旋转、缩⼩和放⼤。

要求:1.给出所⽤算法的理论依据和必要的推导过程。

2.给出原始图像和处理后的图像。

时间安排:序号设计内容所⽤时间1根据设计任务确定实验⽅案2天2根据实验条件进⾏电路的测试,并对结果进⾏分析7天3撰写课程设计报告1天合计2周指导教师签名: 年⽉⽇系主任签名: 年⽉⽇⽬录摘要..................................................................................I Abstract ............................................................................. II 1 图像的⼏何变换.. (1)1.1图像⼏何变换内容 (1)1.2 Matlab仿真使⽤的主要函数 (1)2图像的平移变换 (3)2.1图像平移变换原理 (3)2.2图像平移变换的matlab实现 (3)3图像的镜像变换 (4)3.1 图像镜像变换原理 (5)3.2 图像镜像变换的matlab实现 (6)4图像的旋转变换 (6)4.1图像旋转变换原理 (7)4.2 图像旋转变换的matlab实现 (8)5图像的⽐例变换 ..................................................... 错误!未定义书签。

5.1 图像⽐例变换原理 (10)5.2 图像⽐例变换的matlab实现 (10)6 ⼼得体会 (14)参考⽂献 (15)附录 (16)摘要图像是对三维实际景物的平⾯投影,图形图像处理主要是通过计算机对图像进⾏处理,从⽽达到预期的效果的技术。

如何进行平移旋转翻转等几何变换

如何进行平移旋转翻转等几何变换

如何进行平移旋转翻转等几何变换如何进行平移、旋转、翻转等几何变换几何变换是几何学中重要的概念,广泛应用于计算机图形学、游戏开发、计算机辅助设计和工程制图等领域。

通过几何变换,我们可以改变图形的位置、方向和形状,从而达到我们想要的效果。

本文将介绍如何进行平移、旋转和翻转等几何变换,并提供示例说明。

一、平移变换平移变换是指在平面内将图形沿着某个方向移动一定的距离。

平移变换不改变图形的大小和形状,只改变其位置。

对于平面上的一个点(x, y),平移变换的公式为:新的坐标点 = (x + dx, y + dy)其中,dx和dy分别代表在x轴和y轴上的平移距离。

例如,如果要将一个点(2, 3)沿x轴正方向平移3个单位,沿y轴正方向平移2个单位,则变换后的新坐标为(5, 5)。

平移变换也可以用矩阵进行表示。

平移变换矩阵如下所示:[1 0 dx][0 1 dy][0 0 1]二、旋转变换旋转变换是指将图形绕某个点旋转一定的角度。

通过旋转变换,我们可以改变图形的方向和位置。

对于平面上的一个点(x, y),绕原点旋转θ度后的新坐标计算公式为:新的坐标点= (x * cosθ - y * sinθ, x * sinθ + y * cosθ)其中,θ为旋转角度。

例如,如果要将点(1, 1)绕原点逆时针旋转45度,则变换后的新坐标为(0, √2)。

旋转变换也可以用矩阵进行表示。

旋转变换矩阵如下所示:[cosθ -sinθ 0][sinθ cosθ 0][0 0 1]三、翻转变换翻转变换是指将图形关于某个轴或某个点进行对称翻转。

翻转变换有水平翻转和垂直翻转两种情况。

1. 水平翻转:对于平面上的一个点(x, y),关于x轴进行水平翻转后的新坐标计算公式为:新的坐标点 = (x, -y)例如,将点(2, 3)关于x轴进行水平翻转,则变换后的新坐标为(2, -3)。

2. 垂直翻转:对于平面上的一个点(x, y),关于y轴进行垂直翻转后的新坐标计算公式为:新的坐标点 = (-x, y)例如,将点(2, 3)关于y轴进行垂直翻转,则变换后的新坐标为(-2, 3)。

python-opencv图像几何变换--缩放、平移、旋转

python-opencv图像几何变换--缩放、平移、旋转

python-opencv图像⼏何变换--缩放、平移、旋转缩放缩放是调整图⽚的⼤⼩,可以指定输出图像尺⼨⼤⼩,也可以指定缩放⽐例。

opencv函数原型cv2.resize(InputArray src, OutputArray dst, Size, fx, fy, interpolation)InputArray src 输⼊图像OutputArrzy dst输出图像Size输出图像尺⼨fx, fy x轴,y轴的缩放系数interpolation插值⽅式interpolation插值⽅式:插值⽅式有INTER_NEAREST 最近邻插值、INTER_LINEAR 双线性插值、INTER_AREA 像素区域重采样、INTER_CUBIC 4*4像素邻域双三次插值、 INTER_LANCZOS4 8*8像素邻域Lanczos插值。

其中INTER_LINEAR为默认的插值⽅法,⾸选的插值⽅法是INTER_AREA。

我们可以使⽤以下⽅法调整图像⼤⼩:import cv2 as cvimg = cv.imread(r'Lena.png', 1)res1 = cv.resize(img, None, fx=0.5, fy=0.5, interpolation=cv.INTER_AREA)# Orheight, width = img.shape[ : 2]res2 = cv.resize(img, (int(0.5*width), int(0.5*height)), interpolation=cv.INTER_AREA)平移在对图像作平移操作时,需创建变换矩阵。

2⾏3列矩阵,决定了何种变换。

M矩阵则表⽰⽔平⽅向上平移为x⽽竖直⽅向上的平移距离为y。

import numpy as npimport cv2 as cvimg = cv.imread(r'Lena.png', 1)rows, cols, channels = img.shapeM = np.float32([[1,0,100],[0,1,50]])res = cv.warpAffine(img, M, (cols, rows))# cv.warpAffine()第三个参数为输出的图像⼤⼩,值得注意的是该参数形式为(width, height)。

图像的几何变换(平移、旋转、镜像)

图像的几何变换(平移、旋转、镜像)

一、图像平移strel %用来创建形态学结构元素translate(SE,[y x])%原结构元素SE上y和x方向平移imdilate%形态学膨胀代码:I=imread('Bluesky.jpg');se=translate(strel(1),[180 190]);B=imdilate(I,se);figure(1);subplot(1,2,1);subimage(I);title('原图像'); subplot(1,2,2);subimage(B);title('平移后图像');figure(2);subplot(1,2,1);imshow(I);title('原图像'); subplot(1,2,2);imshow(B);title('平移后图像');%显然subimage()命令可以显示图像轴而imshow()不可以结果:Figure1Figure2:二、图像镜像B=imtransform(A,TFORM,method);TFORM=makeform(transformtype,Matrix);%空间变换结构参数transformtype指定了变换的类型,常见的’affine’为二维或多维仿射变换,包括平移、旋转、比例、拉伸和错切等。

Matrix为相应的仿射变换矩阵。

代码:A=imread('Bluesky.jpg');[height,width,dim]=size(A);%计算图像尺寸tform=maketform('affine',[-1 0 0;0 1 0;width 0 1]);%空间变换结构,其中[-1 0 0;0 1 0;width 0 1]为水平翻转矩阵B=imtransform(A,tform,'nearest');tform2=maketform('affine',[1 0 0;0 -1 0;0 height 1]);%空间变换结构,其中[1 0 0;0 -1 0;0 height 1]为垂直翻转矩阵C=imtransform(A,tform2,'nearest');figure;subplot(1,3,1);imshow(A);title('原图');subplot(1,3,2);imshow(B);title('水平镜像');imwrite(B,'水平镜像.jpg');subplot(1,3,3);imshow(C);title('垂直镜像');imwrite(B,'垂直镜像.jpg');结果:加上代码tightfig 后如下(白边框变小了):Tightfig 函数代码如下:function hfig = tightfig(hfig)% tightfig: Alters a figure so that it has the minimum size necessary to % enclose all axes in the figure without excess space around them. %% Note that tightfig will expand the figure to completely encompass all % axes if necessary. If any 3D axes are present which have been zoomed, % tightfig will produce an error, as these cannot easily be dealt with. %% hfig - handle to figure, if not supplied, the current figure will be used% instead.原图水平镜像垂直镜像if nargin == 0hfig = gcf;end% There can be an issue with tightfig when the user has been modifying % the contnts manually, the code below is an attempt to resolve this, % but it has not yet been satisfactorily fixed% origwindowstyle = get(hfig, 'WindowStyle');set(hfig, 'WindowStyle', 'normal');% 1 point is 0.3528 mm for future use% get all the axes handles note this will also fetch legends and % colorbars as wellhax = findall(hfig, 'type', 'axes');% get the original axes units, so we can change and reset these again % laterorigaxunits = get(hax, 'Units');% change the axes units to cmset(hax, 'Units', 'centimeters');% get various position parameters of the axesif numel(hax) > 1% fsize = cell2mat(get(hax, 'FontSize'));ti = cell2mat(get(hax,'TightInset'));pos = cell2mat(get(hax, 'Position'));else% fsize = get(hax, 'FontSize');ti = get(hax,'TightInset');pos = get(hax, 'Position');end% ensure very tiny border so outer box always appearsti(ti < 0.1) = 0.15;% we will check if any 3d axes are zoomed, to do this we will check if% they are not being viewed in any of the 2d directionsviews2d = [0,90; 0,0; 90,0];for i = 1:numel(hax)set(hax(i), 'LooseInset', ti(i,:));% set(hax(i), 'LooseInset', [0,0,0,0]);% get the current viewing angle of the axes[az,el] = view(hax(i));% determine if the axes are zoomediszoomed = strcmp(get(hax(i), 'CameraViewAngleMode'), 'manual');% test if we are viewing in 2d mode or a 3d viewis2d = all(bsxfun(@eq, [az,el], views2d), 2);if iszoomed && ~any(is2d)error('TIGHTFIG:haszoomed3d', 'Cannot make figures containing zoomed 3D axes tight.')endend% we will move all the axes down and to the left by the amount% necessary to just show the bottom and leftmost axes and labels etc. moveleft = min(pos(:,1) - ti(:,1));movedown = min(pos(:,2) - ti(:,2));% we will also alter the height and width of the figure to just% encompass the topmost and rightmost axes and lablesfigwidth = max(pos(:,1) + pos(:,3) + ti(:,3) - moveleft);figheight = max(pos(:,2) + pos(:,4) + ti(:,4) - movedown);% move all the axesfor i = 1:numel(hax)set(hax(i), 'Position', [pos(i,1:2) - [moveleft,movedown],pos(i,3:4)]);endorigfigunits = get(hfig, 'Units');set(hfig, 'Units', 'centimeters');% change the size of the figurefigpos = get(hfig, 'Position');set(hfig, 'Position', [figpos(1), figpos(2), figwidth, figheight]);% change the size of the paperset(hfig, 'PaperUnits','centimeters');set(hfig, 'PaperSize', [figwidth, figheight]);set(hfig, 'PaperPositionMode', 'manual');set(hfig, 'PaperPosition',[0 0 figwidth figheight]);% reset to original units for axes and figureif ~iscell(origaxunits)origaxunits = {origaxunits};endfor i = 1:numel(hax)set(hax(i), 'Units', origaxunits{i});endset(hfig, 'Units', origfigunits);% set(hfig, 'WindowStyle', origwindowstyle);end三、图像转置代码段:A=imread('Bluesky.jpg');tform=maketform('affine',[0 1 0;1 0 0;0 0 1]);B=imtransform(A,tform,'nearest');figure;subplot(1,2,1);imshow(A);title('原图');subplot(1,2,2);imshow(B);title('转置后');tightfig;imwrite(B,'转置后图像.jpg');结果:原图转置后四、图像的中心旋转B=imrotate(A,angle,method,’crop’);angle为旋转角度,正值为逆时针旋转。

旋转、平移和镜像变换

旋转、平移和镜像变换

旋转、平移和镜像变换旋转、平移和镜像变换是几种常见的图形变换方法,在计算机图形学、几何学以及艺术设计等领域都有广泛应用。

通过这些变换,我们可以改变图形的位置、形状和方向,从而达到我们想要的效果。

1. 旋转变换旋转变换是将一个图形按照某个点为中心点进行旋转,使得图形围绕这个中心点旋转一定角度。

旋转变换可以分为顺时针旋转和逆时针旋转两种。

旋转变换的公式为:x' = x*cosθ - y*sinθy' = x*sinθ + y*cosθ其中,(x, y)表示原始的点的坐标,(x', y')表示旋转后的点的坐标,θ表示旋转的角度。

2. 平移变换平移变换是将一个图形沿着平移向量的方向进行移动,使得图形整体平移一定距离。

平移变换是保持图形形状和方向不变的基本变换之一。

平移变换的公式为:x' = x + dxy' = y + dy其中,(x, y)表示原始的点的坐标,(x', y')表示平移后的点的坐标,(dx, dy)表示平移向量。

3. 镜像变换镜像变换是将一个图形按照某个镜像轴进行对称,使得图形在镜像轴两侧呈镜像关系。

镜像变换可以分为水平镜像和垂直镜像两种。

水平镜像变换的公式为:x' = xy' = y垂直镜像变换的公式为:x' = -xy' = y其中,(x, y)表示原始的点的坐标,(x', y')表示镜像后的点的坐标。

通过组合使用旋转、平移和镜像变换,我们可以实现更加复杂的变换效果。

例如,可以先将一个图形进行平移,然后再进行旋转和镜像变换,从而得到一个整体上更加生动和有趣的图形。

总结:旋转、平移和镜像变换是图形变换中常用的几种方法。

它们可以灵活地改变图形的位置、形状和方向,为计算机图形学、几何学和艺术设计等领域提供了丰富的工具和技术。

熟练掌握这些变换方法,对于创作和处理图形具有重要意义。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

MFC空间几何变换之图像平移、镜像、旋转、缩放详解一. 图像平移前一篇文章讲述了图像点运算(基于像素的图像变换),这篇文章讲述的是图像几何变换:在不改变图像容的情况下对图像像素进行空间几何变换的处理方式。

点运算对单幅图像做处理,不改变像素的空间位置;代数运算对多幅图像做处理,也不改变像素的空间位置;几何运算对单幅图像做处理,改变像素的空间位置,几何运算包括两个独立的算法:空间变换算法和灰度级插值算法。

空间变换操作包括简单空间变换、多项式卷绕和几何校正、控制栅格插值和图像卷绕,这里主要讲述简单的空间变换,如图像平移、镜像、缩放和旋转。

主要是通过线性代数中的齐次坐标变换。

图像平移坐标变换如下:运行效果如下图所示,其中BMP图片(0,0)像素点为左下角。

其代码核心算法:1.在对话框中输入平移坐标(x,y) m_xPY=x,m_yPY=y2.定义Place=dlg.m_yPY*m_nWidth*3 表示当前m_yPY行需要填充为黑色3.新建一个像素矩阵ImageSize=new unsigned char[m_nImage]4.循环整个像素矩阵处理for(int i=0 ; i<m_nImage ; i++ ){if(i<Place) {ImageSize[i]=black;continue;}//黑色填充底部从小往上绘图else if(i>=Place && countWidth<dlg.m_xPY*3) {//黑色填充左部分ImageSize[i]=black;countWidth++; continue;}else if(i>=Place && countWidth>=dlg.m_xPY*3) {//图像像素平移区域ImageSize[i]=m_pImage[m_pImagePlace];//原(0,0)像素赋值过去m_pImagePlace++;countWidth++;if(countWidth==m_nWidth*3) {//一行填满m_pImagePlace走到(0,1)number++;m_pImagePlace=number*m_nWidth*3;}}}5.写文件绘图fwrite(ImageSize,m_nImage,1,fpw)第一步:在ResourceView资源视图中,添加Menu子菜单如下:(注意ID号)第二步:设置平移对话框。

将试图切换到ResourceView界面--选中Dialog,右键鼠标新建一个Dialog,并新建一个名为IDD_DIALOG_PY。

编辑框(X)IDC_EDIT_PYX 和(Y)IDC_EDIT_PYY,确定为默认按钮。

设置成下图对话框:第三步:在对话框资源模板空白区域双击鼠标—Create a new class创建一个新类--命名为CImagePYDlg。

会自动生成它的.h和.cpp文件。

打开类向导(Ctrl W),选择类名:CImagePYDlg添加成员变量如下图所示,同时在Message Maps中生成ID_JHBH_PY实现函数。

第四步:在CImageProcessingView.cpp中添加头文件#include "ImagePYDlg.h",并实现平移。

[cpp]view plain copy1./********************************************************/2./*图像空间几何变换:图像平移ID_JHBH_PY(几何变换-平移)3./*使用平移对话框:CImagePYDlg dlg4./*算法:f(x,y)=f(x+x0,y+y0)图像所有点平移,空的补黑'0'5./*注意该图像平移方法只是从左上角(0,0)处开始平移6./*其他方向原理相同自己去实现7./********************************************************/8.9.void CImageProcessingView::OnJhbhPy()10.{11.if(numPicture==0){12.AfxMessageBox("载入图片后才能空间平移!",MB_OK,0);13.return;14.}15.//定义采样对话框也是用来空间变换平移的坐标16.CImagePYDlg dlg;17.if(dlg.DoModal()==IDOK)//显示对话框18.{19.//采样坐标最初为图片的自身像素20.if(dlg.m_xPY>m_nWidth||dlg.m_yPY>m_nHeight){21.AfxMessageBox("图片平移不能为超过原图长宽!",MB_OK,0);22.return;23.}24.AfxMessageBox("图片空间变换-平移!",MB_OK,0);25.26.//打开临时的图片读写文件27.FILE*fpo=fopen(BmpName,"rb");28.FILE*fpw=fopen(BmpNameLin,"wb+");29.fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);30.fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);31.fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);32.fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fpw);33.fread(m_pImage,m_nImage,1,fpo);34.35./************************************************************/36./*图片空间变换-平移37./*坐标(dlg.m_xPY,dlg.m_yPY)表示图像平移的坐标38./*先用Plave计算出平移后的起始坐标,其他的坐标赋值为'0'黑色39./*然后依次平移坐标,空的赋为黑色,否则填充40./************************************************************/41.42./******************************************************************/43./*严重错误1:数组变量赋值相等44./*在View.h中定义变量BYTE*m_pImage读入图片数据后的指针45./*建立临时变量数组,让它平移变换unsigned char*ImageSize46./*ImageSize=m_pImage(错误)47./*会导致ImageSize赋值变换时m_pImage也产生了变换,所以输出全为黑色48./*因为它俩指向了相同的数组地址49./*解决方法:使用下面C++的new方法动态分配或for循环i=m_nImage赋值50./******************************************************************/51.52./*临时变量存储的像素与m_pImage相同,便于处理图像*/53.unsigned char*ImageSize;54.ImageSize=new unsigned char[m_nImage];//new和delete有效的进行动态存的分配和释放55.56.int Place;//建立临时坐标记录起始坐标(0,0)平移过来的位置57.int m_pImagePlace;//原始图像平移为(0,0)图像把它平移到Place位置58.unsigned char black;//填充黑色='0'59.60./************************************************************/61./*for(int i=0;i<m_nHeight;i++)62./*for(int j=0;j<m_nWidth;j++)63./*不能使用的上面的因为可能图像的最后一行没有完整的一行像素64./*这样会出现exe报错,使用m_nImage读写所有像素比较正确65./************************************************************/66.67.Place=dlg.m_yPY*m_nWidth*3;//前m_yPY行都要填充为黑色68.black=0;//颜色为黑色69.m_pImagePlace=0;//图像处事位置为(0,0),把该点像素平移过去70.int countWidth=0;//记录每行的像素个数,满行时变回071.int number=0;//数字记录使用的像素行数,平移时使用72.73.for(int i=0;i<m_nImage;i++)74.{75./*如果每行的像素填满时清为0*/76.if(countWidth==m_nWidth*3){77.countWidth=0;78.}79.80./*第一部分:到平移后像素位置前面的所有像素点赋值为黑色*/81.if(i<Place){82.ImageSize[i]=black;//赋值为黑色83.continue;84.}85.86./*第二部分:平移区域的左边部分赋值为黑色*/87.else if(i>=Place&&countWidth<dlg.m_xPY*3){//RGB乘388.ImageSize[i]=black;//赋值为黑色89.countWidth++;90.continue;91.}92.93./****************************/94./*各部分如图所示:95./*00000000000000000000000096./*00000000000000000000000097./*0000000.................98./*0000000.................99./*0000000.................100./*0000000.................101./*点表示像素部分,0为黑色102./****************************/103.104./*重点错误提示:由于bmp图像显示是从左下角开始存储(0,0)点所以输出图像为*/ 105./*bmp图像是从左下角到右上角排列的*/106.107./****************************/108./*各部分如图所示:109./*0000000.................110./*0000000.................111./*0000000.................112./*0000000.................113./*000000000000000000000000114./*000000000000000000000000115./*点表示像素部分,0为黑色116./****************************/117.118./*第三部分:图像像素平移区域*/119.else if(i>=Place&&countWidth>=dlg.m_xPY*3)120.{121.ImageSize[i]=m_pImage[m_pImagePlace];122.m_pImagePlace++;123.countWidth++;124.if(countWidth==m_nWidth*3)125.{126.number++;127.m_pImagePlace=number*m_nWidth*3;128.}129.}130.}131.132.fwrite(ImageSize,m_nImage,1,fpw);133.fclose(fpo);134.fclose(fpw);135.numPicture=2;136.level=200;//200表示几何变换137.Invalidate();138.}139.}同时在ShowBitmap中添加level标记重新绘制图片,代码如下:[cpp]view plain copy1.else//图像几何变换2.if(level=200)3.{4.m_hBitmapChange=(HBITMAP)LoadImage(NULL,BmpNameLin,IMAGE_BITMAP,0,0,5.LR_LOADFROMFILE|LR_DEFAULTSIZE|LR_CREATEDIBSECTION);6.}运行时需要注意一点:BMP图像在处理过程中可能会出现一些斜线,而平移(40,60)位移量时可能出现如下。

相关文档
最新文档