读取图像将图像旋转25°不调用库函数能够在visual 2019 上正常运行的c语言代码
时间: 2023-06-18 16:02:49 浏览: 80
下面是一个示例代码,用于将图像旋转25度:
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define PI 3.1415926
int main()
{
FILE *fp_in, *fp_out;
unsigned char *image_in, *image_out;
char file_in_name[100], file_out_name[100];
int width, height, bpp, i, j, x, y, x1, y1;
double angle = 25.0;
// 读取输入图像
printf("Enter the input file name: ");
scanf("%s", file_in_name);
fp_in = fopen(file_in_name, "rb");
if (!fp_in)
{
printf("Error: failed to open the input file!\n");
return -1;
}
fseek(fp_in, 18, SEEK_SET);
fread(&width, sizeof(int), 1, fp_in); // 读取图像宽度
fread(&height, sizeof(int), 1, fp_in); // 读取图像高度
bpp = fgetc(fp_in) / 8; // 读取每个像素所占的字节数
fseek(fp_in, 54, SEEK_SET);
image_in = (unsigned char*)malloc(width * height * bpp);
fread(image_in, sizeof(unsigned char), width * height * bpp, fp_in); // 读取图像数据
fclose(fp_in);
// 分配输出图像内存
image_out = (unsigned char*)malloc(width * height * bpp);
// 计算旋转后的图像大小
int new_width = (int)(abs(width * cos(angle * PI / 180.0)) + abs(height * sin(angle * PI / 180.0)));
int new_height = (int)(abs(height * cos(angle * PI / 180.0)) + abs(width * sin(angle * PI / 180.0)));
// 计算旋转后的图像中心点
int center_x = width / 2;
int center_y = height / 2;
for (i = 0; i < new_height; i++)
{
for (j = 0; j < new_width; j++)
{
// 计算旋转前的坐标
x1 = j - center_x;
y1 = i - center_y;
x = (int)(x1 * cos(angle * PI / 180.0) + y1 * sin(angle * PI / 180.0) + center_x);
y = (int)(-x1 * sin(angle * PI / 180.0) + y1 * cos(angle * PI / 180.0) + center_y);
// 检查坐标是否越界
if (x >= 0 && x < width && y >= 0 && y < height)
{
// 复制像素值
image_out[(i * new_width + j) * bpp + 0] = image_in[(y * width + x) * bpp + 0];
image_out[(i * new_width + j) * bpp + 1] = image_in[(y * width + x) * bpp + 1];
image_out[(i * new_width + j) * bpp + 2] = image_in[(y * width + x) * bpp + 2];
}
else
{
// 越界的像素设为白色
image_out[(i * new_width + j) * bpp + 0] = 255;
image_out[(i * new_width + j) * bpp + 1] = 255;
image_out[(i * new_width + j) * bpp + 2] = 255;
}
}
}
// 保存输出图像
printf("Enter the output file name: ");
scanf("%s", file_out_name);
fp_out = fopen(file_out_name, "wb");
if (!fp_out)
{
printf("Error: failed to open the output file!\n");
return -1;
}
fseek(fp_out, 18, SEEK_SET);
fwrite(&new_width, sizeof(int), 1, fp_out);
fwrite(&new_height, sizeof(int), 1, fp_out);
fputc(bpp * 8, fp_out);
fseek(fp_out, 54, SEEK_SET);
fwrite(image_out, sizeof(unsigned char), new_width * new_height * bpp, fp_out);
fclose(fp_out);
// 释放内存
free(image_in);
free(image_out);
return 0;
}
```
注意:这个代码假定输入图像为BMP格式,且每个像素的颜色通道顺序为BGR。如果你的输入图像格式或者颜色通道顺序不同,需要相应地修改代码。
阅读全文