本文介绍了旋转图片框中的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在下面的代码中有两个例外(错误)突然发生



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;
}
解决方案


这篇关于旋转图片框中的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-31 06:51