画像回転アルゴリズム
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軸の値を表します。
転載先: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;
}