画像回転アルゴリズム

6388 ワード

この記事は記事を転載するために、より多くの友達がこのアルゴリズムを最適化することを望んでいます。
転載先:http://www.cnblogs.com/ice6/archive/2010/08/19/rotating-an-image-in-silverlight-without-cropping.html
回転アルゴリズムは以下の通りです。
Rotation[degrees counterclockwise]
Subscript Manipulation using Pixels
0
Out[i,j]=In[i,j]
90
Out[j,Right-i-1]=In[i,j]
180
Out[Right-i-1,Bottom-j-1]=In[i,j]
270
Out[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; }