Bitmap pic = new Bitmap(newW, newH);
 Graphics g = Graphics.FromImage(pic);
 g.SmoothingMode = SmoothingMode.AntiAlias;
g.CompositingQuality = CompositingQuality.HighQuality;
//绘图操作
..........
//
g.dispose();
this.backgroudImage=pic;
每次缩放图片都执行上面的代码,经过几次缩放后出现错误,图片变成了两条交叉红直线,没有报异常,请问哪位大神知道原因?

解决方案 »

  1.   

    //图片每次释放执行下列代码
    Bitmap pic = new Bitmap(this.Width, this.Height);
    Graphics g = Graphics.FromImage(pic);
     g.SmoothingMode = SmoothingMode.AntiAlias;
      g.CompositingQuality = CompositingQuality.HighQuality;
       //鼠标点在新界面的坐标
        newMouseX = px * ratio;
        newMouseY = py * ratio;
         #region 缩放后重绘图形         #region 重绘直线
             if (dxfReadOrWrite.lineList.Count > 0)
                 {
                      foreach (DxfLine dLine in dxfReadOrWrite.lineList)
                           {
                                System.Drawing.Pen penLine = new System.Drawing.Pen(ColorIndexContrastTable.ColorIndexList[dLine.ColorIndex], 0);//画笔
                                 dLine.ScaleStartX = (dLine.ScaleStartX - px) * ratio + newMouseX;
                                  dLine.ScaleEndX = (dLine.ScaleEndX - px) * ratio + newMouseX;
                                   dLine.ScaleStartY = (dLine.ScaleStartY - py) * ratio + newMouseY;
                                   dLine.ScaleEndY = (dLine.ScaleEndY - py) * ratio + newMouseY;
                                    g.DrawLine(penLine, new PointF((float)dLine.ScaleStartX, (float)dLine.ScaleStartY), new PointF((float)dLine.ScaleEndX, (float)dLine.ScaleEndY));
                              }
                  }
        #endregion    #region 重绘圆弧
         if (dxfReadOrWrite.arcList.Count > 0)
              {
                  foreach (DxfArc dArc in dxfReadOrWrite.arcList)
                         {
                                 dArc.ScaleCenterX = (dArc.ScaleCenterX - px) * ratio + newMouseX;
                                  dArc.ScaleCenterY = (dArc.ScaleCenterY - py) * ratio + newMouseY;                               dArc.ScaleRadius = (float)dArc.ScaleRadius * ratio;
                                    float lefttop_x = (float)(dArc.ScaleCenterX - dArc.ScaleRadius);
                                    float lefttop_y = (float)(dArc.ScaleCenterY - dArc.ScaleRadius);
                                     System.Drawing.Pen penArc = new System.Drawing.Pen(ColorIndexContrastTable.ColorIndexList[dArc.ColorIndex], 0);//画笔
                                       float _angle = (float)((dArc.AngleEnd - dArc.AngleStart));
                                       float swapangle = float.MinValue;
                                        if (_angle > 0)
                                         {
                                                swapangle = _angle;
                                          }
                                          if (_angle < 0)
                                           {
                                                 swapangle = 360 + _angle;
                                           }
                                           g.DrawArc(penArc, new RectangleF(lefttop_x, lefttop_y, (float)(2 * dArc.ScaleRadius), (float)(2 * dArc.ScaleRadius)), (float)(360 - dArc.AngleEnd), swapangle);
                                            }
                                        }
                                        #endregion                                    #region 重绘圆
                                        //圆的中心点相对应鼠标点的距离进行等比例放大/缩小
                                        if (dxfReadOrWrite.circleList.Count > 0)
                                        {
                                            foreach (DxfCircle dCircle in dxfReadOrWrite.circleList)
                                            {
                                                System.Drawing.Pen penCircle = new System.Drawing.Pen(ColorIndexContrastTable.ColorIndexList[dCircle.ColorIndex], 0);//画笔                                            dCircle.ScaleCircleCenterX = (dCircle.ScaleCircleCenterX - px) * ratio + newMouseX;
                                                dCircle.ScaleCircleCenterY = (dCircle.ScaleCircleCenterY - py) * ratio + newMouseY;                                            dCircle.ScaleRadius = (float)dCircle.ScaleRadius * ratio;
                                                float lefttop_x = (float)(dCircle.ScaleCircleCenterX - dCircle.ScaleRadius);
                                                float lefttop_y = (float)(dCircle.ScaleCircleCenterY - dCircle.ScaleRadius);
                                                g.DrawArc(penCircle, new RectangleF(lefttop_x, lefttop_y, (float)(2 * dCircle.ScaleRadius), (float)(2 * dCircle.ScaleRadius)), 0, 360);                                        }
                                        }
                                        #endregion                                    #region 重绘填充
                                        if (dxfReadOrWrite.hatchList.Count > 0)
                                        {
                                            foreach (DxfHatch dHatch in dxfReadOrWrite.hatchList)
                                            {
                                                for (int i = 0; i < 4; i++)
                                                {
                                                    dHatch.ScalePointX[i] = (dHatch.ScalePointX[i] - px) * ratio + newMouseX;
                                                    dHatch.ScalePointY[i] = (dHatch.ScalePointY[i] - py) * ratio + newMouseY;
                                                }
                                                float fillwidth = (float)Math.Abs(dHatch.ScalePointX[3] - dHatch.ScalePointX[2]);
                                                float fillheight = (float)Math.Abs(dHatch.ScalePointY[1] - dHatch.ScalePointY[2]);
                                                float lefttop_x = (float)dHatch.ScalePointX[1];
                                                float lefttop_y = (float)dHatch.ScalePointY[1];
                                                System.Drawing.Brush _BrushHatch = new SolidBrush(ColorIndexContrastTable.ColorIndexList[dHatch.ColorIndex]);
                                                g.FillRectangle(_BrushHatch, new RectangleF(lefttop_x, lefttop_y, fillwidth, fillheight));
                                            }                                    }    
        #endregion
         g.dispose();
          this.backgroundImage=pic;
        #endregion                                                                  
      

  2.   

    我想表达的是,现在每次缩放后都要重新Bitmap pic =new Bitmap,在pic上画图,然后控件背景图片绑定这个pic,经过多次是否这样就导致了如图那个问题。