我可以使用没有这些工件的graphics.RotateTransform()吗?

时间:2012-02-02 18:11:06

标签: c# graphics bitmap rotation gdi+

我正在实现一个颜色选择器组件,如seminal article中所述。

正如您所看到的,我已经对基础知识进行了分类:

Working colour wheel

然而,其中一个要求是能够使色轮旋转任意量。认为这很容易,我对鼠标位置有一些算术 - >颜色值代码和以下代码实际绘制轮子的位:

newGraphics.TranslateTransform((float)this.Radius, (float)this.Radius);
newGraphics.RotateTransform((float)this.offset);
newGraphics.TranslateTransform((float)this.Radius * -1, (float)this.Radius * -1);

不幸的是,像这样旋转位图实际上产生了这个:

Broken colour wheel after rotation

请注意出现在中心两侧的人工制品。

我使用了错误的方法吗?还是有办法摆脱这些令人讨厌的裂缝?

1 个答案:

答案 0 :(得分:3)

查看该Microsoft示例的源代码,我通过添加矩阵并设置UpdateDisplay方法对RotateAt方法进行了以下更改。

private void UpdateDisplay() {
  // Update the gradients, and place the 
  // pointers correctly based on colors and 
  // brightness.

  using (Brush selectedBrush = new SolidBrush(selectedColor)) {      
    using (Matrix m = new Matrix()) {
      m.RotateAt(35f, centerPoint);
      g.Transform = m;
      // Draw the saved color wheel image.
      g.DrawImage(colorImage, colorRectangle);
      g.ResetTransform();
    }

    // Draw the "selected color" rectangle.
    g.FillRectangle(selectedBrush, selectedColorRectangle);

    // Draw the "brightness" rectangle.
    DrawLinearGradient(fullColor);
    // Draw the two pointers.
    DrawColorPointer(colorPoint);
    DrawBrightnessPointer(brightnessPoint);
  }
}

它将车轮旋转了35度(尽管现在已经关闭了颜色选择,因为我没有弄乱所有代码,所以35度,并且它没有产生任何撕裂。

不是100%肯定这是答案(但评论时间太长),所以这可能会有所帮助。