图片旋转算法

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

转载地址: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轴上的值

  private WriteableBitmap WBRotate(WriteableBitmap wb, int CounterclockwiseAngle)
  {
      int [,] wb_arr = new int [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 ( int c = 0; c < wb.PixelWidth; c++) // r=row    c=column
      {
          for ( int r = 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 = new WriteableBitmap(wb.PixelWidth, wb.PixelHeight);
          wb_arr_2 = new int [wb.PixelWidth, wb.PixelHeight];
          wb_arr_2 = wb_arr;
      }
      else if (CounterclockwiseAngle == 90 || CounterclockwiseAngle == -270) //90 -270//Math.Sin(
      {
          wb2 = new WriteableBitmap(wb.PixelHeight, wb.PixelWidth);
          wb_arr_2 = new int [wb.PixelHeight, wb.PixelWidth];
          for ( int c = 0; c < wb_arr.GetLength(0); c++) //width  i
          {
              for ( int r = 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代表真个宽度
              }
          }
      }
      else if (CounterclockwiseAngle == 180 || CounterclockwiseAngle == -180) //180 -180
      {
          wb2 = new WriteableBitmap(wb.PixelWidth, wb.PixelHeight);
          wb_arr_2 = new int [wb.PixelWidth, wb.PixelHeight];
          for ( int c = 0; c < wb_arr.GetLength(0); c++) //width  i
          {
              for ( int r = 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] 
              }
          }
      }
      else if (CounterclockwiseAngle == 270 || CounterclockwiseAngle == -90) //270 -90
      {
          wb2 = new WriteableBitmap(wb.PixelHeight, wb.PixelWidth);
          wb_arr_2 = new int [wb.PixelHeight, wb.PixelWidth];
          for ( int c = 0; c < wb_arr.GetLength(0); c++) //width  i
          {
              for ( int r = 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
      {
          return null ; //如果是其他角度 就直接返回null
      }
      //将二位数组转换成Pixels
      for ( int r = 0; r < wb_arr_2.GetLength(1); r++) // r=row    c=column
      {
          for ( int c = 0; c < wb_arr_2.GetLength(0); c++)
          {
              wb2.Pixels[wb2.PixelWidth * r + c] = wb_arr_2[c, r];
          }
      }
      return wb2;
  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值