Bitmap pic = new Bitmap(newW, newH);
Graphics g = Graphics.FromImage(pic);
g.SmoothingMode = SmoothingMode.AntiAlias;
g.CompositingQuality = CompositingQuality.HighQuality;
//繪圖操作
..........
//
g.dispose();
this.backgroudImage=pic;
每次縮放圖片都執行上面的代碼,經過幾次縮放后出現錯誤,圖片變成了兩條交叉紅直線,沒有報例外,請問哪位大神知道原因?
uj5u.com熱心網友回復:
懷疑有記憶體泄露,你把代碼貼完整一些再看看。uj5u.com熱心網友回復:
//繪圖操作..........
//

這部分關鍵代碼你貼上來,不然看啥
uj5u.com熱心網友回復:
//圖片每次釋放執行下列代碼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
uj5u.com熱心網友回復:
我想表達的是,現在每次縮放后都要重新Bitmap pic =new Bitmap,在pic上畫圖,然后控制元件背景圖片系結這個pic,經過多次是否這樣就導致了如圖那個問題。uj5u.com熱心網友回復:
是否寬高出現負數導致的錯誤?uj5u.com熱心網友回復:
應該不是,我有試驗后,就是畫簡單的矩形,經過多次縮放后也會出現這種大紅叉。轉載請註明出處,本文鏈接:https://www.uj5u.com/net/94808.html
標籤:C#
上一篇:獲取第三方程式狀態欄資訊
下一篇:我想請教一個MVC的問題
