图片旋转算法

来源:互联网 发布:大数据案例分析有哪些 编辑:程序博客网 时间:2024/06/09 19:27

本文为转载文章,但是希望更多的朋友来优化该算法。

转载地址:http://www.cnblogs.com/ice6/archive/2010/08/19/rotating-an-image-in-silverlight-without-cropping.html


旋转算法如下:

Rotation[degrees counterclockwise]Subscript Manipulation using Pixels0Out[i, j] = In[i, j]90Out[j, Right-i-1] = In[i, j]180Out[Right-i-1, Bottom-j-1] = In[i, j]270Out[Bottom-j-1,i] = In[i, j]
i代表x轴的值,j代表Y轴上的值

 privateWriteableBitmap WBRotate(WriteableBitmap wb, intCounterclockwiseAngle)
 {
     int[,] wb_arr = newint[wb.PixelWidth, wb.PixelHeight];
     //导致许多缺页中断的初始化循环
     //for (int r = 0; r < wb.PixelHeight; r++)// r=row    c=column
     //{
     //    for (int c = 0; c < wb.PixelWidth; c++)
     //    {
     //        wb_arr[c, r] = wb.Pixels[wb.PixelWidth * r + c];
     //    }
     //}
     //导致较少缺页中断的初始化循环 对上面代码的简单优化
     for(intc = 0; c < wb.PixelWidth; c++)// r=row    c=column
     {
         for(intr = 0; r < wb.PixelHeight; r++)
         {
             wb_arr[c, r] = wb.Pixels[wb.PixelWidth * r + c];
         }
     }
 
     WriteableBitmap wb2;
     int[,] wb_arr_2;
 
     if(CounterclockwiseAngle == 0 || CounterclockwiseAngle == 360 || CounterclockwiseAngle == -360)//0度 360度
     {
         wb2 = newWriteableBitmap(wb.PixelWidth, wb.PixelHeight);
         wb_arr_2 = newint[wb.PixelWidth, wb.PixelHeight];
         wb_arr_2 = wb_arr;
     }
     elseif(CounterclockwiseAngle == 90 || CounterclockwiseAngle == -270)//90 -270//Math.Sin(
     {
         wb2 = newWriteableBitmap(wb.PixelHeight, wb.PixelWidth);
         wb_arr_2 = newint[wb.PixelHeight, wb.PixelWidth];
         for(intc = 0; c < wb_arr.GetLength(0); c++)//width  i
         {
             for(intr = 0; r < wb_arr.GetLength(1); r++)//height j
             {
                 wb_arr_2[r, wb_arr.GetLength(0) - c - 1] = wb_arr[c, r]; //90 Out[j, Right-i-1] = In[i, j]  Right代表真个宽度
             }
         }
     }
     elseif(CounterclockwiseAngle == 180 || CounterclockwiseAngle == -180)//180 -180
     {
         wb2 = newWriteableBitmap(wb.PixelWidth, wb.PixelHeight);
         wb_arr_2 = newint[wb.PixelWidth, wb.PixelHeight];
         for(intc = 0; c < wb_arr.GetLength(0); c++)//width  i
         {
             for(intr = 0; r < wb_arr.GetLength(1); r++)//height j
             {
                 wb_arr_2[wb_arr.GetLength(0) - c - 1, wb_arr.GetLength(1) - r - 1] = wb_arr[c, r]; //180 Out[Right-i-1, Bottom-j-1] = In[i, j] 
             }
         }
     }
     elseif(CounterclockwiseAngle == 270 || CounterclockwiseAngle == -90)//270 -90
     {
         wb2 = newWriteableBitmap(wb.PixelHeight, wb.PixelWidth);
         wb_arr_2 = newint[wb.PixelHeight, wb.PixelWidth];
         for(intc = 0; c < wb_arr.GetLength(0); c++)//width  i
         {
             for(intr = 0; r < wb_arr.GetLength(1); r++)//height j
             {
                 wb_arr_2[wb_arr.GetLength(1) - r - 1, c] = wb_arr[c, r]; //270 Out[Bottom-j-1,i] = In[i, j]
             }
         }
     }
     else
     {
         returnnull;//如果是其他角度 就直接返回null
     }
     //将二位数组转换成Pixels
     for(intr = 0; r < wb_arr_2.GetLength(1); r++)// r=row    c=column
     {
         for(intc = 0; c < wb_arr_2.GetLength(0); c++)
         {
             wb2.Pixels[wb2.PixelWidth * r + c] = wb_arr_2[c, r];
         }
     }
     returnwb2;
 }

原创粉丝点击