2008-09-21 16 views
9

LinearGradientBrush in .net (hoặc thậm chí trong GDI + như một tổng thể?) Dường như có một lỗi nghiêm trọng: Đôi khi, nó giới thiệu các tạo phẩm. (Xem here hoặc here - về cơ bản, dòng đầu tiên của một dốc tuyến tính được vẽ trong màu cuối cùng, tức là một gradient từ Trắng sang Đen sẽ bắt đầu bằng một đường Màu đen và sau đó với độ dốc Trắng đến Đen thích hợp)LinearGradientBrush Artifact Workaround?

Tôi tự hỏi nếu có ai tìm được cách giải quyết cho việc này? Đây là một lỗi thực sự gây phiền nhiễu :-(

Đây là một hình ảnh của Artifacts, lưu ý rằng có 2 LinearGradientBrushes:.

alt text http://img142.imageshack.us/img142/7711/gradientartifactmm6.jpg

+0

Awesome, vì vậy bây giờ đi lên đầu tiên đối với hầu hết các tìm kiếm wtf của tôi :) –

+0

Được kéo tóc của tôi ra trên này cho một giờ tốt – Antony

Trả lời

9

tôi đã nhận thấy điều này là tốt khi sử dụng bàn chải dốc duy nhất cách giải quyết hiệu quả mà tôi có là luôn tạo ra hình chữ nhật cọ vẽ có kích thước lớn hơn 1 pixel trên tất cả các cạnh so với vùng được vẽ với nó. Điều đó bảo vệ bạn khỏi vấn đề trên tất cả bốn cạnh. các cạnh là một phần nhỏ so với những gì bạn chỉ định, nhưng điều này tốt hơn so với vấn đề tạo tác vẽ!

+0

Đối với mục đích của tôi, làm việc và bây giờ là vật cuối cùng đã mất hết \ o/ –

5

Bạn có thể sử dụng phương pháp Inflate (int i) tốt đẹp trên hình chữ nhật để có được phiên bản lớn hơn.

+0

tôi đã làm thậm chí không biết chức năng đó. khéo léo :) –

1

Ít nhất với WPF, bạn có thể thử sử dụng GradientStop s để nhận được 100% màu sắc chính xác ngay tại các cạnh, ngay cả khi vượt quá.

2

Tôi sẽ đánh giá cao câu trả lời của Phil ở trên (đây thực sự là nhận xét nhưng tôi không có đặc quyền đó). Các hành vi tôi thấy là trái với the documentation, mà nói:

dòng sự khởi đầu vuông góc với đường định hướng và đi qua một trong các góc của hình chữ nhật. Tất cả các điểm trên vạch xuất phát là màu bắt đầu. Sau đó, dòng kết thúc vuông góc với đường định hướng và đi qua một trong các góc của hình chữ nhật. Tất cả các điểm trên dòng kết thúc là màu kết thúc.

Cụ thể là bạn nhận được một điểm ảnh xung quanh một điểm ảnh trong một số trường hợp. Theo như tôi có thể nói (bằng cách thử nghiệm) tôi chỉ nhận được vấn đề khi chiều rộng hoặc chiều cao của hình chữ nhật là lẻ. Vì vậy, để làm việc xung quanh các lỗi tôi thấy nó là đủ để tăng hình chữ nhật LinearGradientBrush 1 pixel nếu và chỉ khi kích thước (trước khi mở rộng) là một số lẻ. Nói cách khác, luôn luôn làm tròn hình chữ nhật cọ lên số lượng pixel thậm chí tiếp theo ở cả chiều rộng và chiều cao.

Vì vậy, để điền vào một hình chữ nhật r tôi sử dụng một cái gì đó như:

Rectangle gradientRect = r; 
if (r.Width % 2 == 1) 
{ 
    gradientRect.Width += 1; 
} 
if (r.Height % 2 == 1) 
{ 
    gradientRect.Height += 1; 
} 
var lgb = new LinearGradientBrush(gradientRect, startCol, endCol, angle); 
graphics.FillRectangle(lgb, r); 

Insane nhưng là sự thật.

Các vấn đề liên quan