本文介绍了旋转图片框中的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
在下面的代码中有两个例外(错误)突然发生
1)参数无效
rotateBmp = new位图(nWidth,nHeight);
2)
g.DrawImage((Image)image.Clone(),内存不足,分数);
有时我会调用RotateImage1(..);在计时器(Windows.Form)
,其中增加角度为360,以旋转PictureBox图像。
public static 位图RotateImage1(图像, float 角度,表格f)
{
if (image == null )
throw new ArgumentNullException( image);
const double pi2 = Math.PI / 2 。 0 ;
double oldWidth = Convert.ToDouble( 420 );
double oldHeight = Convert.ToDouble( 420 );
double theta =(( double )angle)* Math.PI / 180 。 0 ;
double locked_theta = theta;
while (locked_theta < 0 。 0 )
locked_theta + = 2 * Math.PI;
double newWidth,newHeight;
int nWidth,nHeight;
double adjacentTop,oppositeTop;
double adjacentBottom,oppositeBottom;
if ((locked_theta > = 0 。 0 && locked_theta < pi2)||
( locked_theta > = Math.PI&& locked_theta < (Math.PI + pi2)) )
{
adjacentTop = Math.Abs(Math.Cos(locked_theta))* oldWidth;
oppositeTop = Math.Abs(Math.Sin(locked_theta))* oldWidth;
adjacentBottom = Math.Abs(Math.Cos(locked_theta))* oldHeight;
oppositeBottom = Math.Abs(Math.Sin(locked_theta))* oldHeight;
}
else
{
adjacentTop = Math.Abs(Math.Sin(locked_theta))* oldHeight;
oppositeTop = Math.Abs(Math.Cos(locked_theta))* oldHeight;
adjacentBottom = Math.Abs(Math.Sin(locked_theta))* oldWidth;
oppositeBottom = Math.Abs(Math.Cos(locked_theta))* oldWidth;
}
newWidth = adjacentTop + oppositeBottom;
newHeight = adjacentBottom + oppositeTop;
nWidth =( int )Math.Ceiling(newWidth);
nHeight =( int )Math.Ceiling(newHeight);
位图rotateBmp;
rotateBmp = new 位图(nWidth,nHeight);
使用(图形g = Graphics.FromImage(rotateBmp))
{
// 此数组将用于传递三个点
/ / 弥补旋转的图像
点[]点;
if (locked_theta > = 0 . 0 && locked_theta < pi2)
{
points = new Point []
{
new Point(( int )oppositeBottom, 0 ),
new Point(nWidth,( int )oppositeTop),
new Point( 0 ,( int )adjacentBottom)
};
}
其他 if (locked_theta > = pi2&& locked_theta < Math.PI)
{
points = new Point []
{
new Point(nWidth,( int )oppositeTop),
new Point(( int )adjacentTop ,nHeight),
new Point(( int )oppositeBottom, 0 )
};
}
其他 if (locked_theta > = Math.PI&& locked_theta < (Math.PI + pi2))
{
points = new Point []
{
new Point(( int )adjacentTop,nHeight),
new Point( 0 ,( int )adjacentBottom),
new 点(nWidth,( int )oppositeTop)
};
}
其他
{
points = new Point []
{
new Point( 0 ,( int )adjacentBottom),
new Point(( int )oppositeBottom, 0 ),
new Point(( int )adjacentTop,nHeight)
};
}
g.DrawImage((Image)image.Clone(),points);
}
return rotatingBmp;
}
解决方案
In below code there are two exceptions(error) which occurs suddenly
1)Parameter is not valid in
rotatedBmp = new Bitmap(nWidth, nHeight);
2)Out of memory in
g.DrawImage((Image)image.Clone(), points);
Error occurs sometimes i am calling RotateImage1(..); in timer(Windows.Form)
which increment angle to 360 in order to rotate PictureBox image.
public static Bitmap RotateImage1(Image image, float angle, Form f) { if (image == null) throw new ArgumentNullException("image"); const double pi2 = Math.PI / 2.0; double oldWidth = Convert.ToDouble(420); double oldHeight = Convert.ToDouble(420); double theta = ((double)angle) * Math.PI / 180.0; double locked_theta = theta; while (locked_theta < 0.0) locked_theta += 2 * Math.PI; double newWidth, newHeight; int nWidth, nHeight; double adjacentTop, oppositeTop; double adjacentBottom, oppositeBottom; if ((locked_theta >= 0.0 && locked_theta < pi2) || (locked_theta >= Math.PI && locked_theta < (Math.PI + pi2))) { adjacentTop = Math.Abs(Math.Cos(locked_theta)) * oldWidth; oppositeTop = Math.Abs(Math.Sin(locked_theta)) * oldWidth; adjacentBottom = Math.Abs(Math.Cos(locked_theta)) * oldHeight; oppositeBottom = Math.Abs(Math.Sin(locked_theta)) * oldHeight; } else { adjacentTop = Math.Abs(Math.Sin(locked_theta)) * oldHeight; oppositeTop = Math.Abs(Math.Cos(locked_theta)) * oldHeight; adjacentBottom = Math.Abs(Math.Sin(locked_theta)) * oldWidth; oppositeBottom = Math.Abs(Math.Cos(locked_theta)) * oldWidth; } newWidth = adjacentTop + oppositeBottom; newHeight = adjacentBottom + oppositeTop; nWidth = (int)Math.Ceiling(newWidth); nHeight = (int)Math.Ceiling(newHeight); Bitmap rotatedBmp; rotatedBmp = new Bitmap(nWidth, nHeight); using (Graphics g = Graphics.FromImage(rotatedBmp)) { // This array will be used to pass in the three points that // make up the rotated image Point[] points; if (locked_theta >= 0.0 && locked_theta < pi2) { points = new Point[] { new Point( (int) oppositeBottom, 0 ), new Point( nWidth, (int) oppositeTop ), new Point( 0, (int) adjacentBottom ) }; } else if (locked_theta >= pi2 && locked_theta < Math.PI) { points = new Point[] { new Point( nWidth, (int) oppositeTop ), new Point( (int) adjacentTop, nHeight ), new Point( (int) oppositeBottom, 0 ) }; } else if (locked_theta >= Math.PI && locked_theta < (Math.PI + pi2)) { points = new Point[] { new Point( (int) adjacentTop, nHeight ), new Point( 0, (int) adjacentBottom ), new Point( nWidth, (int) oppositeTop ) }; } else { points = new Point[] { new Point( 0, (int) adjacentBottom ), new Point( (int) oppositeBottom, 0 ), new Point( (int) adjacentTop, nHeight ) }; } g.DrawImage((Image)image.Clone(), points); } return rotatedBmp; }
解决方案
这篇关于旋转图片框中的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!