Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在C中以90度的增量旋转bmp图像?

如何在C中以90度的增量旋转bmp图像?
EN

Stack Overflow用户
提问于 2013-10-20 19:21:24
回答 3查看 3.2K关注 0票数 0

我正在尝试用C语言编写这个程序来操作bmp图像,到目前为止,我已经成功地将其旋转如下:

代码语言:javascript
运行
AI代码解释
复制
 for (row=0; row < rows; row++)
      for (col=0; col < cols; col++) 
        {
          (*new) + rows*col + (rows - row -1) = original + row*cols + col;
        }

其中:原始=原始bmp,新=比例大小的新bmp,这取决于我要应用的旋转量。两者都是指向bmp的指针,而new是指向指针的指针。我已经做了几次计算,它逆时针旋转它,而实际上它应该顺时针旋转。这是一个问题,但我想我可以逆时针旋转它足够的时间,让它看起来像是顺时针旋转。我的问题是:如何从原始的bmp图像进行多次旋转,并使其最终显示在我正在创建的新的bmp图像上。也就是说,我如何多次执行上述操作,而仍然只有一个输入和一个输出文件的大小正确。我喜欢用指针来做这件事,因为这会让我更容易在其他过程中操作输出。我希望这是足够的细节。

谢谢。

EN

回答 3

Stack Overflow用户

发布于 2013-10-20 21:43:04

使用矩阵。伪码:

代码语言:javascript
运行
AI代码解释
复制
class Matrix {
    double m11,m12,m21,m22;
};

dest.x = matrix.m11*src.x + matrix.m12*src.y;
dest.y = matrix.m21*src.x + matrix.m22*src.y;

where x = x - image.width/2 and y = y - image.height/2

http://en.wikipedia.org/wiki/Rotation_matrix#Common_rotations

票数 0
EN

Stack Overflow用户

发布于 2013-11-06 19:16:44

下面的代码演示了一个浮点数组旋转90度的倍数。我后来将浮动数组转换为字节数组,以便可以生成测试图像来验证结果;我没有包括这部分代码,因为它只是混淆了要点,并不是您真正想要的。如果你需要那部分,让我知道我会张贴它。

请注意,我做的是“错位”而不是“就地”的旋转。我相信后者才是你真正感兴趣的,但即便如此,下面的方法对你来说应该是一个很好的开始。关于就地转换的其他讨论可以是found here,它围绕转置类型操作(内存交换)的使用展开,但我没有时间对所有这些细节进行排序,我将这一部分留给您。

回想一下,对于n*90度的逆时针旋转,变换由下式给出:

因此,当然:

但在实际代码中,您需要分别将row‘和col’转换为imageHeight/2和imageWidth/2,如下面的代码所示,以避免将负索引传递给数组。

将row_p和col_p表示为row‘and col',代码如下:

代码语言:javascript
运行
AI代码解释
复制
// Note:  nX = pixels wide, nY = pixels tall
float *dataVector = // some data source, arbitrary

// Setup the array for the out-of-place transformation:
float *dataVector2 = new float[nX*nY]; 

int n = -2;  // Example: set n = -2 to rotate counter-clockwise 180 deg
for (int row = 0; row < nY; row++) {
    for (int col = 0; col < nX; col++) {
        int row_p = cosf(n*M_PI_2)*(row-nY/2) - sinf(n*M_PI_2)*(col-nX/2) + nY/2;
        int col_p = sinf(n*M_PI_2)*(row-nY/2) + cosf(n*M_PI_2)*(col-nX/2) + nX/2;
        dataVector2[row*nX + col] = dataVector[row_p*nX + col_p];
    }
}

// Later convert float array to image ...

请注意,在上面的代码中,我使用旋转后的坐标来访问原始数组的元素,然后将这些值映射回原始的行、列坐标:

代码语言:javascript
运行
AI代码解释
复制
dataVector2[row*nX + col] = dataVector[row_p*nX + col_p]; 

这样做的结果是+n值给出了顺时针旋转;如果您希望逆时针旋转,只需将负值n传递给您的代码,即-n,如上面的示例所示。这样做的效果是只改变上面旋转矩阵的非对角项的符号。

希望这能有所帮助。

票数 0
EN

Stack Overflow用户

发布于 2013-11-07 04:17:31

简化代码的一种方法是定义您将沿着循环遍历的两个2D基础:

原始基数:

  • x0 = 0
  • y0 = 0
  • dx = 1
  • dy =cols

<代码>F29

新基地

  • x0 = rows - 1
  • y0 = 0
  • dx = rows
  • dy = -1

用这些重写你的代码应该会容易得多。它还具有从内部循环中删除乘法的好处。

代码语言:javascript
运行
AI代码解释
复制
PIXEL *source = original;
PIXEL *target = new + (rows - 1) + (0 * cols);

int source_di = 1;
int source_dj = cols;

int target_di = rows;
int target_dj = -1;

for (int j = 0; j < rows; ++j) {
    int saved_source = source;
    int saved_target = target;

    for (int i = 0; i < cols; ++i) {
        *target = *source;
        source += source_di;
        target += target_di;
    }

    source = saved_source + source_dj;
    target = saved_target + target_dj;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19481733

复制
相关文章
c语言读取bmp图像_opencv 图像处理
以前都是使C语言中File* 、fopen、fread等操作文件,这几天学习了C++ IO标准库,就应用来读取bmp图像。
全栈程序员站长
2022/10/02
1.7K0
C语言之图像旋转
最近用到了图像向左或者向右旋转90°的情况,纠结了好一会儿,写下来供大家参考。 1 向左旋转90° //unsigned char *pImgData: 输入图像指针 //int WidthIn, int HeightIn:输入图像宽、高 //unsigned char *pImgOut: 旋转后图像指针 void RotateOfLeft(unsigned char *pImgData, int WidthIn, int HeightIn) { int i, j, tempSize; in
闪电gogogo
2018/08/21
2.6K0
图像旋转即c++实现
主要还是考虑面试的时候会不会用到,刚才好好看了下旋转的这个思路,其实和图像缩放的思路差不多的,主要的问题是要找到坐标的映射方式。 因为还是包含了一部分的公式,所以我再word里写好然后截图上来吧。
和蔼的zhxing
2018/09/04
1.4K0
图像旋转即c++实现
OpenCV 3.1.0中的图像放缩与旋转
OpenCV在3.1.0版本中的图像放缩与旋转操作比起之前版本中更加的简洁方便,同时还提供多种插值方法可供选择。首先来看图像放缩,通过OpenCV核心模块API函数resize即可实现图像的放大与缩小。 一:图像放缩(zoom in/out) 函数resize相关API参数介绍 -src表示输入图像,类型一般是Mat类型 -dst表示输出图像,类型一般是Mat类型 -dsize表示输出图像大小,如果是零的话表示从fx与fy两个参数计算得到 dsize= Size(round(src.cols*fx), r
OpenCV学堂
2018/04/04
2.3K0
OpenCV 3.1.0中的图像放缩与旋转
旋转图像
说明: 你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。
木瓜煲鸡脚
2021/01/18
1.4K0
旋转图像
旋转图像\
给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。
狼啸风云
2023/10/23
2420
旋转图像\
图像旋转
描述 输入一个n行m列的黑白图像,将它顺时针旋转90度后输出。 输入第一行包含两个整数n和m,表示图像包含像素点的行数和列数。1 <= n <= 100,1 <= m <= 100。 接下来n行,每行m个整数,表示图像的每个像素点灰度。相邻两个整数之间用单个空格隔开,每个元素均在0~255之间。输出m行,每行n个整数,为顺时针旋转90度后的图像。相邻两个整数之间用单个空格隔开。样例输入 3 3 1 2 3 4 5 6 7 8 9 样例输出 7 4 1 8 5 2 9 6 3 #include<iostrea
用户1631856
2018/04/12
2.1K0
图像旋转
问题描述 试题编号: 201503-1 试题名称: 图像旋转 时间限制: 5.0s 内存限制: 256.0MB 问题描述: 问题描述   旋转是图像处理的基本操作,在这个问题中,你需要将一个图像逆时针旋转90度。   计算机中的图像表示可以用一个矩阵来表示,为了旋转一个图像,只需要将对应的矩阵旋转即可。 输入格式   输入的第一行包含两个整数n, m,分别表示图像矩阵的行数和列数。   接下来n行每行包含m个整数,表示输入的图像。 输出格式   输出m行,每行包含n个整数,表示原始矩阵逆时针旋转90度后的矩阵。 样例输入 2 3 1 5 3 3 2 4 样例输出 3 4 5 2 1 3 评测用例规模与约定   1 ≤ n, m ≤ 1,000,矩阵中的数都是不超过1000的非负整数。
geekfly
2022/05/06
9660
算法(BMP图像格式处理)
张爱玲:人生是一袭华丽的袍子,里面爬满了虱子。 林世霖:BMP是一幅美丽的图画,里面爬满了算法。
用户2617681
2019/08/08
1.4K0
算法(BMP图像格式处理)
bmp图像大小biSizeImage算法公式由来
LPBITMAPINFOHEADER lpbmiHeader; // ... 计算BMP方法 法一:lpbmiHeader->biSizeImage = (cx * biBitCount + 31)/32*4*cy; 法二:lpbmiHeader->biSizeImage = ((cx * biBitCount + 31) & ~31) / 8 * cy; 法三:lpbmiHeader->biSizeImage = ((cx * biBitCount + 31) & ~31) >> 3 * cy; 前提:
_gongluck
2018/03/09
2.5K0
OpenCV旋转图像
M = cv2.getRotationMatrix2D((cx, cy), angle, 1) # 旋转中心,角度degree,放大比例
用户6021899
2023/09/19
2340
OpenCV旋转图像
opencv图像翻转、图像旋转
淼学派对
2023/10/14
3450
opencv图像翻转、图像旋转
图像旋转矫正
11.0 uint8 3 0.017453292519943295 0.022727272727272728 0.022723360841641067 1.3019526725788753 -88.69804732742112
裴来凡
2022/05/29
7730
图像旋转矫正
【CCF】图像旋转
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
喜欢ctrl的cxk
2019/11/08
7510
图像保真旋转
import cv2 import numpy as np from math import * img=cv2.imread('C:/Users/xpp/Desktop/Lena.png') img[:,:,0]=255 def rotate(image,angle): height, width,channels=image.shape #变换后新图像的大小是原图像旋转后的轮廓外接矩形,注意这个外接矩形的长和高也是水平和竖直的 heightNew=int(width*fabs
裴来凡
2022/05/29
5560
图像保真旋转
将数组旋转90度(旋转图像)
You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise).
用户5513909
2023/04/25
1.8K0
将数组旋转90度(旋转图像)
图像处理: 无损地旋转图像
OpenCV自带的旋转图像方法 (有损) 原图像: 如果用OpenCV自带cv2.warpAffine接口来实现图片旋转: import cv2 # 读取原图像 img = cv2.imrea
JNingWei
2018/09/27
2.8K0
图像处理: 无损地旋转图像
48. 旋转图像
给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像
CaesarChang张旭
2021/06/01
6440
48. 旋转图像
点击加载更多

相似问题

用C旋转BMP图像

21

C++:BMP旋转图像

22

C/C++旋转BMP图像

35

旋转bmp图像c++ 90度

14

在C中旋转bmp图像的最快方法是什么?

22
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档