2012-03-02 35 views
11

Trong đoạn mã sau, tôi đang cố gắng để vẽ hai dòng: Một có chiều rộng subpixel (0.5) và khác với chiều rộng 1px:Làm thế nào để vẽ một đường subpixel

 var img = new Bitmap(256, 256); 
     Graphics graphics = Graphics.FromImage(img); 
     graphics.SmoothingMode = SmoothingMode.AntiAlias; 

     // Draw a subpixel line (0.5 width) 
     graphics.DrawLine(new Pen(Color.Red, (float)0.5), 0, 100, 255, 110); 

     // Draw a single pixel line (1 width) 
     graphics.DrawLine(new Pen(Color.Red, (float)1), 0, 110, 255, 120); 

     img.Save(@"c:\temp\test.png", ImageFormat.Png); 

     graphics.Dispose(); 

     img.Dispose(); 

Tuy nhiên, trong tạo hình ảnh, cả hai dòng xuất hiện cùng một chiều rộng:

enter image description here

có cách nào cho dòng trên cùng xuất hiện sub-pixel (0.5px)?

Chỉnh sửa: Sau một số nghiên cứu, AGG có thể là cách để đi, trong đó có c# port.

+0

Xin đừng tiền tố tiêu đề của bạn với "C#" và như vậy. Đó là những gì các thẻ cho. –

+0

Giả sử mục tiêu của bạn có ý nghĩa. Ngoại suy, làm thế nào để bạn mong đợi một dòng với chiều rộng bút 0,001 pixel để tìm? –

+0

Nếu bạn giảm kích thước hình ảnh có đường 1 pixel bằng ứng dụng đồ họa, hình ảnh kết quả sẽ hiển thị đường bị mờ. –

Trả lời

1

Theo documentation for Pen,

Thuộc tính Width được thiết lập với giá trị quy định trong tham số chiều rộng. Một chiều rộng từ 0 sẽ dẫn đến việc vẽ Pen như nếu chiều rộng là 1.

Có thể áp dụng cho bất kỳ chiều rộng ít hơn một, không chỉ chiều rộng mà là chính xác bằng 0.

+0

Ah, điều đó có ý nghĩa. – FredL

0

Tôi không nghĩ rằng việc sử dụng subpixel ở đây trong trường hợp này là có ý nghĩa. Bạn vẫn đang xuất tệp đó sang tệp hình ảnh. Thay vào đó, hãy thử giá trị độ rộng lớn hơn.

+0

Bạn có nghĩa là không thể vẽ đường phụ pixel khi xuất sang tệp hình ảnh? – FredL

+0

Tệp hình ảnh về cơ bản là ma trận pixel. Làm thế nào để bạn nghĩ rằng nó có thể có thể đại diện cho thông tin phụ pixel trong nó? – myin528

+0

http://en.wikipedia.org/wiki/Subpixel_rendering#Examples – FredL

0

This article đề cập đến lỗi trong GDI + Bút khiến cho nó không thể giảm tỷ lệ chính xác khi độ rộng của nó nhỏ hơn 1.5.

Ngoài ra, nếu bạn cố vẽ ba đường có chiều rộng 2.0F, 2.5F3.0F tương ứng, bạn sẽ thấy sự khác biệt về hình ảnh, vì vậy trường hợp của bạn thực sự trông giống như một số vấn đề với GDI +.

Three Pens with 0.5 width increment

7

bạn có thể hack nó bằng cách vẽ mọi thứ x2 và sau đó mở rộng nó xuống:

 Image img2x = new Bitmap(256*2, 256*2); 
     Graphics g2x = Graphics.FromImage(img2x); 
     g2x.SmoothingMode = SmoothingMode.AntiAlias; 
     g2x.DrawLine(new Pen(Color.Red, 0.5f*2), 0, 100*2, 255*2, 110*2); 

     Image img = new Bitmap(256, 256); 
     Graphics g = Graphics.FromImage(img); 
     g.SmoothingMode = SmoothingMode.AntiAlias; 
     g.DrawImage(img2x, 0, 0, 256, 256); 

     g.DrawLine(new Pen(Color.Red, 1f), 0, 110, 255, 120); 

     img.Save(@"c:\tmep\test.png", ImageFormat.Png); 

enter image description here

+0

Đề xuất thú vị. Bạn đã chứng minh rằng có thể hiển thị các đường con pixel trong một png. Dường như nó chỉ là một hạn chế của GDI + mà điều này không thể được thực hiện mà không cần thu nhỏ. – FredL

+0

Nó không thực sự subpixel - thường đề cập đến kỹ thuật dựng hình mà xem xét bố trí subpixel màu đỏ và xanh bên dưới. Đây chỉ là một dòng chiều rộng phân đoạn nên có thể ở bất cứ nơi nào nhưng GDI + dường như không đối phó với chiều rộng <1. Xem http://freespace.virgin.net/hugo.elias/graphics/x_wuline.htm – gordy

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