我有一個小型的繪畫程序,我正在研究。我在位圖上使用SetPixel來繪製線條。當畫筆大小變大時,像25個像素一樣,會有明顯的性能下降。我想知道是否有更快的方式繪製到位圖。這裏有一些項目的背景:SetPixel太慢。有沒有更快的方法來繪製位圖?
- 我使用的位圖,以便我可以利用圖層,就像在Photoshop或GIMP。
- 線條正在手動繪製,因爲這將最終使用圖形輸入板壓力來改變線條在其長度上的大小。
- 這些線條最終應沿邊緣反斜線/平滑。
我會包含我的繪圖代碼,以防萬一它是慢的而不是Set-Pixel位。
這在繪畫發生在窗口:
private void canvas_MouseMove(object sender, MouseEventArgs e)
{
m_lastPosition = m_currentPosition;
m_currentPosition = e.Location;
if(m_penDown && m_pointInWindow)
m_currentTool.MouseMove(m_lastPosition, m_currentPosition, m_layer);
canvas.Invalidate();
}
的MouseMove的執行情況:
public override void MouseMove(Point lastPos, Point currentPos, Layer currentLayer)
{
DrawLine(lastPos, currentPos, currentLayer);
}
的DrawLine的執行情況:
// The primary drawing code for most tools. A line is drawn from the last position to the current position
public override void DrawLine(Point lastPos, Point currentPos, Layer currentLayer)
{
// Creat a line vector
Vector2D vector = new Vector2D(currentPos.X - lastPos.X, currentPos.Y - lastPos.Y);
// Create the point to draw at
PointF drawPoint = new Point(lastPos.X, lastPos.Y);
// Get the amount to step each time
PointF step = vector.GetNormalisedVector();
// Find the length of the line
double length = vector.GetMagnitude();
// For each step along the line...
for (int i = 0; i < length; i++)
{
// Draw a pixel
PaintPoint(currentLayer, new Point((int)drawPoint.X, (int)drawPoint.Y));
drawPoint.X += step.X;
drawPoint.Y += step.Y;
}
}
實施PaintPoint的:
public override void PaintPoint(Layer layer, Point position)
{
// Rasterise the pencil tool
// Assume it is square
// Check the pixel to be set is witin the bounds of the layer
// Set the tool size rect to the locate on of the point to be painted
m_toolArea.Location = position;
// Get the area to be painted
Rectangle areaToPaint = new Rectangle();
areaToPaint = Rectangle.Intersect(layer.GetRectangle(), m_toolArea);
// Check this is not a null area
if (!areaToPaint.IsEmpty)
{
// Go through the draw area and set the pixels as they should be
for (int y = areaToPaint.Top; y < areaToPaint.Bottom; y++)
{
for (int x = areaToPaint.Left; x < areaToPaint.Right; x++)
{
layer.GetBitmap().SetPixel(x, y, m_colour);
}
}
}
}
非常感謝任何幫助,您可以提供。
謝謝你。我想我知道發生了什麼; ptr是包含紅色,綠色和藍色像素值的位圖數據的集合,並且正在手動設置它們。 今天我會告訴大家一切,看看它是如何實現的。非常感謝,我覺得我的理解進一步提高了一個檔次:P 只是一件事,我認爲C#中的位圖也有一個alpha通道。我認爲這將與RGB一起在像素顏色信息中處理。 – Pyro
您需要指定http://msdn.microsoft.com/en-us/library/system.drawing.imaging.pixelformat.aspx以包含alpha組件。只需將'PixelFormat.Format24bppRgb'改爲'PixelFormat.Format32bppArgb'。我相信它應該在R之後,以+3抵消。如果每個像素使用32位,則需要將'x * 3'更改爲'x * 4',因爲現在每個像素都是4個字節。 – Jack
我剛剛試過這個。現在在所有的筆刷尺寸上都非常可愛且快速!但是現在有一些奇怪的行爲:實際繪圖發生在鼠標所在位置的偏移處。 我不知道它什麼做這行的位置: 的BitmapData數據= bmp.LockBits(新的Rectangle(areaToPaint.Right,areaToPaint.Bottom),ImageLockMode.ReadWrite,PixelFormat.Format24bppRgb); 需要爲矩形指定一個位置。我使用提供的'位置'值。是對的嗎? – Pyro