修改擦除模式逻辑,确保擦除画笔大小根据图像缩放比例进行调整,使视觉效果与光标块保持一致
This commit is contained in:
@@ -1549,22 +1549,40 @@ namespace JoyD.Windows.CS
|
||||
// 擦除模式:使用透明色填充,设置CompositingMode为清除
|
||||
g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;
|
||||
|
||||
// 计算考虑图像缩放比例的画笔大小
|
||||
// 由于我们需要让实际擦除区域在视觉上与光标块大小一致
|
||||
// 这里需要根据图像缩放比例来调整画笔大小
|
||||
int adjustedBrushSize = _currentBrushSize;
|
||||
if (picBoxTemp.Image != null)
|
||||
{
|
||||
// 计算控件到图像的缩放比例(图像实际大小与控件显示大小的比例)
|
||||
float scaleX = (float)picBoxTemp.Image.Width / picBoxTemp.ClientSize.Width;
|
||||
float scaleY = (float)picBoxTemp.Image.Height / picBoxTemp.ClientSize.Height;
|
||||
|
||||
// 使用缩放比例调整画笔大小,使擦除区域在视觉上与光标块一致
|
||||
adjustedBrushSize = (int)(_currentBrushSize * Math.Min(scaleX, scaleY));
|
||||
|
||||
// 确保调整后的画笔大小不会太小或太大
|
||||
adjustedBrushSize = Math.Max(adjustedBrushSize, 1); // 最小1像素
|
||||
adjustedBrushSize = Math.Min(adjustedBrushSize, 50); // 最大50像素
|
||||
}
|
||||
|
||||
// 如果是首次擦除或上一个点无效,记录当前点作为起点
|
||||
if (_lastDrawPoint == Point.Empty)
|
||||
{
|
||||
_lastDrawPoint = imagePoint;
|
||||
// 绘制起始点的圆形(擦除区域)
|
||||
int radius = _currentBrushSize / 2;
|
||||
int radius = adjustedBrushSize / 2;
|
||||
g.FillEllipse(Brushes.Transparent,
|
||||
imagePoint.X - radius,
|
||||
imagePoint.Y - radius,
|
||||
_currentBrushSize,
|
||||
_currentBrushSize);
|
||||
adjustedBrushSize,
|
||||
adjustedBrushSize);
|
||||
}
|
||||
else
|
||||
{
|
||||
// 使用透明色绘制粗线条进行擦除
|
||||
using (Pen pen = new Pen(Color.Transparent, _currentBrushSize))
|
||||
// 使用透明色绘制粗线条进行擦除,使用调整后的画笔大小
|
||||
using (Pen pen = new Pen(Color.Transparent, adjustedBrushSize))
|
||||
{
|
||||
pen.StartCap = LineCap.Round;
|
||||
pen.EndCap = LineCap.Round;
|
||||
@@ -1911,7 +1929,29 @@ namespace JoyD.Windows.CS
|
||||
{
|
||||
// 擦除模式:使用透明色填充,设置CompositingMode为清除
|
||||
g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;
|
||||
|
||||
// 计算考虑图像缩放比例的画笔大小
|
||||
// 由于我们需要让实际擦除区域在视觉上与光标块大小一致
|
||||
int adjustedBrushSize = _currentBrushSize;
|
||||
if (picBoxTemp.Image != null)
|
||||
{
|
||||
// 计算控件到图像的缩放比例(图像实际大小与控件显示大小的比例)
|
||||
float scaleX = (float)picBoxTemp.Image.Width / picBoxTemp.ClientSize.Width;
|
||||
float scaleY = (float)picBoxTemp.Image.Height / picBoxTemp.ClientSize.Height;
|
||||
|
||||
// 使用缩放比例调整画笔大小,使擦除区域在视觉上与光标块一致
|
||||
adjustedBrushSize = (int)(_currentBrushSize * Math.Min(scaleX, scaleY));
|
||||
|
||||
// 确保调整后的画笔大小不会太小或太大
|
||||
adjustedBrushSize = Math.Max(adjustedBrushSize, 1); // 最小1像素
|
||||
adjustedBrushSize = Math.Min(adjustedBrushSize, 50); // 最大50像素
|
||||
}
|
||||
|
||||
// 使用调整后的画笔大小填充矩形
|
||||
// 为了保持与光标一致的视觉效果,我们需要使用画笔大小来调整擦除行为
|
||||
// 这里我们直接填充整个矩形,但使用与画笔大小相匹配的方式
|
||||
g.FillRectangle(Brushes.Transparent, _tempDiffTempRectangle);
|
||||
|
||||
g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceOver;
|
||||
}
|
||||
else
|
||||
|
||||
Reference in New Issue
Block a user