在C中旋转bmp图像

时间:2015-10-29 08:01:53

标签: c file-io rotation bmp

我在C中旋转bmp图像文件。 我成功测试了复制图像(旋转0度)。但是,旋转图像一定是个问题。这是我的代码

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
#pragma warning (disable:4996)

#define FILENAMELENGTH 30
#define MAXROW 512
#define MAXCOL 512

//location of pixels
typedef struct
{
   int row;
   int col;
}COORDI;

//function declarations
void RotatePixel(float Theta, COORDI org, COORDI before, COORDI* after);
void ReadImage(char* original_image);
void WriteImage(char* rotate_image);

char source[MAXROW][MAXCOL];
char dest[MAXROW][MAXCOL];

COORDI org;
float Theta;

int main(void)
{
    char original_image[FILENAMELENGTH];
    char rotate_image[FILENAMELENGTH];

    printf("image name : ");
    scanf("%s", original_image);

    //rotate angle(radian)
    printf("angle : ");
    scanf("%f", &Theta);


    printf("after rotate file name : ");
    scanf("%s", rotate_image);

    org.row = MAXROW / 2;
    org.col = MAXCOL / 2;

    dest[MAXROW][MAXCOL] = { 0, };

    ReadImage(original_image);
    WriteImage(rotate_image);


    printf("rotate completed!\n");

    return 0;
}


void ReadImage(char* original_image)
{
    FILE* fp;
    int i, j;

    fp = fopen(original_image, "rb");
    if (fp == NULL)
    {
        printf("File cannot open\n");
        exit(-1);
    }


    for (i = 0; i < MAXROW; i++)
    {
        for (j = 0; j < MAXCOL; j++)
            fread(&source[i][j], sizeof(unsigned char), 1, fp);
    }


    printf("image read completed !\n");
    fclose(fp);

    return;
}
  

//将像素写入文件

void WriteImage(char* rotate_image)
{
    FILE* fp;
    int i, j;
    COORDI locn;
    COORDI* after = (COORDI*)malloc(sizeof(COORDI));

    fp = fopen(rotate_image, "wb");
    if (fp == NULL)
    {
        printf("File cannot open\n");
        exit(-1);
    }

    for (i = 0; i < MAXROW; i++)
    {
        for (j = 0; j < MAXCOL; j++)
        {
            locn.row = i;
            locn.col = j;
            RotatePixel(Theta, org, locn, after);

            if (after->col < 0) continue;
            if (after->row < 0) continue;
            if (after->col >= MAXCOL) continue;
            if (after->row >= MAXROW) continue;

            dest[after->row][after->col] = source[i][j];
            putc(dest[after->row][after->col], fp);
        }
    }


    printf("image write completed !\n");
    fclose(fp);

    return;
}
  

//旋转像素

void RotatePixel(float Theta, COORDI org, COORDI before, COORDI* after)
{
    int x, y;
    x = before.col - org.col;
    y = before.row - org.row;

    after->col = (int)(x* cos(Theta) - y*sin(Theta)) + org.col; // x
    after->row = (int)(x* sin(Theta) + y*cos(Theta)) + org.row; // y
}

我认为将像素写入文件是个问题。遗漏点在哪里?

0 个答案:

没有答案