📜  将图像旋转90度的C程序

📅  最后修改于: 2022-05-13 01:57:24.507000             🧑  作者: Mango

将图像旋转90度的C程序

给定一张图片,你将如何将它旋转 90 度?一个模糊的问题。最小化浏览器并在继续之前尝试您的解决方案。

可以将图像视为可以存储在缓冲区中的二维矩阵。我们提供了矩阵维度和它的基地址。我们怎么转呢?

例如看下图,

* * * ^ * * *
* * * | * * *
* * * | * * *
* * * | * * *

向右旋转后出现(注意箭头方向)

* * * *
* * * *
* * * *
-- - - >
* * * *
* * * *
* * * *

这个想法很简单。将源矩阵的每一行转换为最终图像的所需列。我们将使用辅助缓冲区来转换图像。

从上图我们可以观察到

first row of source ------> last column of destination
second row of source ------> last but-one column of destination
so ... on
last row of source ------> first column of destination

以图形的形式,我们可以将上述 (mxn) 矩阵转换为 (nxm) 矩阵,

转型

如果你还没有尝试过,至少现在试试你的伪代码。

编写我们的伪代码将很容易。在 C/C++ 中,我们通常会按行主要顺序遍历矩阵。每一行都被转换成最终图像的不同列。我们需要构建最终图像的列。见以下算法(变换)

for (r = 0; r < m; r++)
{
   for (c = 0; c < n; c++)
   {
      // Hint: Map each source element indices into
      // indices of destination matrix element.
       dest_buffer [ c ] [ m - r - 1 ] = source_buffer [ r ] [ c ];
   }
}

请注意,有多种方法可以实现基于矩阵遍历、行主要或列主要顺序的算法。我们有两个矩阵和两种方法(行和列主要)来遍历每个矩阵。因此,至少可以有 4 种不同的方式将源矩阵转换为最终矩阵。

C
// C program to turn an 
// image by 90 Degree
#include 
#include 
  
void displayMatrix(unsigned int const *p, 
                   unsigned int row, 
                   unsigned int col);
                     
void rotate(unsigned int *pS, 
            unsigned int *pD, 
            unsigned int row, 
            unsigned int col);
              
void displayMatrix(unsigned int const *p, 
                   unsigned int r, 
                   unsigned int c) 
{
    unsigned int row, col;
    printf("
  
");
  
    for (row = 0; row < r; row++)
    {
        for (col = 0; col < c; col++)
            printf("%d    ", * (p + row * c + col));
        printf("
");
    }
  
    printf("
  
");
}
  
void rotate(unsigned int *pS, 
            unsigned int *pD,
            unsigned int row, 
            unsigned int col)
{
    unsigned int r, c;
    for (r = 0; r < row; r++)
    {
        for (c = 0; c < col; c++)
        {
            *(pD + c * row + (row - r - 1)) = 
                            *(pS + r * col + c);
        }
    }
}
  
// Driver Code
int main()
{
      
    // declarations
    unsigned int image[][4] = {{1,2,3,4}, 
                               {5,6,7,8},
                               {9,10,11,12}};
    unsigned int *pSource;
    unsigned int *pDestination;
    unsigned int m, n;
  
    // setting initial values
    // and memory allocation
    m = 3, n = 4, pSource = (unsigned int *)image;
    pDestination = 
        (unsigned int *)malloc 
        (sizeof(int) * m * n);
  
    // process each buffer
    displayMatrix(pSource, m, n);
  
    rotate(pSource, pDestination, m, n);
  
    displayMatrix(pDestination, n, m);
  
    free(pDestination);
  
    getchar();
    return 0;
}



输出 :
1    2    3    4    
5    6    7    8    
9    10    11    12    




9    5    1    
10    6    2    
11    7    3    
12    8    4    



有关详细信息,请参阅将图像旋转 90 度的完整文章!