c++图像拷贝旋转180度
时间: 2023-05-19 11:04:00 浏览: 91
您可以使用OpenCV库中的函数来实现图像的拷贝和旋转。以下是一个示例代码:
```c++
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat image = imread("input.jpg", IMREAD_COLOR);
if (image.empty())
{
std::cout << "Could not read the image" << std::endl;
return 1;
}
Mat rotated;
flip(image, rotated, -1);
imwrite("output.jpg", rotated);
return 0;
}
```
这个代码会读取名为"input.jpg"的图像,将其旋转180度并保存为"output.jpg"。
相关问题
c++ OpenCV图像旋转90度
可以使用OpenCV的rotate函数来实现图像旋转。下面是一个旋转90度的例子代码:
```python
import cv2
img = cv2.imread("image.jpg")
# 获取图像宽高
height, width = img.shape[:2]
# 旋转矩阵
M = cv2.getRotationMatrix2D((width/2, height/2), 90, 1)
# 旋转图像
rotated_img = cv2.warpAffine(img, M, (width, height))
# 显示图像
cv2.imshow("rotated image", rotated_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
在这个例子中,我们首先使用`cv2.imread`函数加载一张图片,然后获取它的宽度和高度。接下来,我们使用`cv2.getRotationMatrix2D`函数生成一个旋转矩阵,该矩阵可以将图像旋转90度。最后,我们使用`cv2.warpAffine`函数来对图像进行旋转,并使用`cv2.imshow`函数来显示旋转后的图像。
bmp图像顺时针旋转90度c++
bmp图像顺时针旋转90度的大致思路是将原图像中每个像素的位置进行变换,然后重新生成新的图像。以下是一个基本的C++代码示例:
```c++
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cstring>
using namespace std;
#pragma pack(2) //按2字节对齐
typedef struct tagBITMAPFILEHEADER {
unsigned short bfType;
unsigned int bfSize;
unsigned short bfReserved1;
unsigned short bfReserved2;
unsigned int bfOffBits;
} BITMAPFILEHEADER;
#pragma pack()
typedef struct tagBITMAPINFOHEADER {
unsigned int biSize;
int biWidth;
int biHeight;
unsigned short biPlanes;
unsigned short biBitCount;
unsigned int biCompression;
unsigned int biSizeImage;
int biXPelsPerMeter;
int biYPelsPerMeter;
unsigned int biClrUsed;
unsigned int biClrImportant;
} BITMAPINFOHEADER;
void rotate90(char* inputFileName, char* outputFileName) {
ifstream input(inputFileName, ios::in | ios::binary);
if (!input) {
cerr << "Error: Can not open input file." << endl;
exit(1);
}
ofstream output(outputFileName, ios::out | ios::binary);
if (!output) {
cerr << "Error: Can not open output file." << endl;
exit(1);
}
BITMAPFILEHEADER fileHeader;
BITMAPINFOHEADER infoHeader;
input.read((char*)&fileHeader, sizeof(BITMAPFILEHEADER));
if (fileHeader.bfType != 0x4d42) {
cerr << "Error: Invalid BMP file format." << endl;
exit(1);
}
input.read((char*)&infoHeader, sizeof(BITMAPINFOHEADER));
if (infoHeader.biBitCount != 24) {
cerr << "Error: Only support 24-bit BMP image." << endl;
exit(1);
}
// 计算新图像的宽度和高度
int newWidth = infoHeader.biHeight;
int newHeight = infoHeader.biWidth;
// 计算新图像每行的字节数和每个像素的字节数
int newLineByte = (newWidth * 3 + 3) / 4 * 4;
int pixelByte = 3;
// 计算新图像的文件大小和图像数据大小
int newImageSize = newLineByte * newHeight;
int newFileSize = fileHeader.bfOffBits + newImageSize;
// 生成新的文件头和信息头
BITMAPFILEHEADER newFileHeader = fileHeader;
newFileHeader.bfSize = newFileSize;
BITMAPINFOHEADER newInfoHeader = infoHeader;
newInfoHeader.biWidth = newWidth;
newInfoHeader.biHeight = newHeight;
newInfoHeader.biSizeImage = newImageSize;
output.write((char*)&newFileHeader, sizeof(BITMAPFILEHEADER));
output.write((char*)&newInfoHeader, sizeof(BITMAPINFOHEADER));
// 读取原图像中每一行的数据,进行旋转后写入新图像中
char* lineData = new char[newLineByte];
memset(lineData, 0, newLineByte);
for (int i = 0; i < infoHeader.biHeight; i++) {
input.read(lineData, infoHeader.biWidth * pixelByte);
for (int j = 0; j < infoHeader.biWidth; j++) {
int x = i;
int y = j;
// 计算旋转后的位置
int newX = y;
int newY = newWidth - 1 - x;
// 将像素数据写入新图像中
output.seekp(newFileHeader.bfOffBits + newY * newLineByte + newX * pixelByte);
output.write(lineData + j * pixelByte, pixelByte);
}
}
delete[] lineData;
input.close();
output.close();
}
int main() {
rotate90("input.bmp", "output.bmp");
return 0;
}
```
这个例子中,我们首先读取了原图像的文件头和信息头,然后计算了新图像的宽度和高度,以及每行的字节数和像素的字节数。接着,我们生成了新的文件头和信息头,并将它们写入输出文件中。最后,我们遍历原图像中的每一行像素数据,进行旋转后写入新图像中。