2013-04-23 29 views
6

Cho một LinearGradientBrush quy định như sau:Làm thế nào để đọc màu sắc từ một bù đắp của một XAML LinearGradientBrush?

 <LinearGradientBrush x:Key="RedYellowGradient"> 
      <GradientStop Color="Blue" Offset="0.01" /> 
      <GradientStop Color="Purple" Offset="0.25"/> 
      <GradientStop Color="Red" Offset="0.5"/> 
      <GradientStop Color="Orange" Offset="0.75"/> 
      <GradientStop Color="Yellow" Offset="1.0"/> 
     </LinearGradientBrush> 

gì là cần thiết để có định nghĩa và xác định màu sắc đại diện bởi một cụ thể bù đắp, như 0,13 hoặc 0,82 mà không cần dựng bất cứ điều gì có thể nhìn thấy?

Điều này sẽ mang hình thức của một hàm với một cái gì đó nguyên mẫu như thế này:

Function GetColorFromBrushOffset(br as LinearGradientBrush, offset as Single) as SomeColorDataStructure 

Điều gì sẽ cần phải đi vào cơ quan chức năng? Tôi không tìm kiếm mã đã hoàn thành (mặc dù tôi sẽ không từ chối nó!) Chỉ là một số ý tưởng về cấu trúc dữ liệu và các cuộc gọi hệ thống sử dụng.

+0

Chỉ cần truy cập vào Gradientstops, và suy giữa mỗi cặp ([0] -> [1], [1] - > [2] vv) bù đắp, bây giờ sử dụng giá trị nội suy để nội suy giữa mỗi cặp màu. – dowhilefor

+0

[this] (http://stackoverflow.com/a/9651053/1069200) có thể hữu ích, có thể trùng lặp –

+0

@JohanLarsson Bạn nói đúng; mã trong một trong các câu trả lời có vẻ đúng cho mục đích của tôi. Tôi muốn tái tạo nó ở đây hơn là đánh dấu bản sao này, vì tôi không thể tìm thấy câu hỏi đó từ các tìm kiếm của tôi, và câu hỏi của anh ta khác về phạm vi. –

Trả lời

6

Lớp này (từ one of this question's answers bởi @JonnyPiazzi) dường như chính xác giải quyết câu hỏi của tôi:

public static class GradientStopCollectionExtensions 
{ 
    public static Color GetRelativeColor(this GradientStopCollection gsc, double offset) 
    { 
     GradientStop before = gsc.Where(w => w.Offset == gsc.Min(m => m.Offset)).First(); 
     GradientStop after = gsc.Where(w => w.Offset == gsc.Max(m => m.Offset)).First(); 

     foreach (var gs in gsc) 
     { 
      if (gs.Offset < offset && gs.Offset > before.Offset) 
      { 
       before = gs; 
      } 
      if (gs.Offset > offset && gs.Offset < after.Offset) 
      { 
       after = gs; 
      } 
     } 

     var color = new Color(); 

     color.ScA = (float)((offset - before.Offset) * (after.Color.ScA - before.Color.ScA)/(after.Offset - before.Offset) + before.Color.ScA); 
     color.ScR = (float)((offset - before.Offset) * (after.Color.ScR - before.Color.ScR)/(after.Offset - before.Offset) + before.Color.ScR); 
     color.ScG = (float)((offset - before.Offset) * (after.Color.ScG - before.Color.ScG)/(after.Offset - before.Offset) + before.Color.ScG); 
     color.ScB = (float)((offset - before.Offset) * (after.Color.ScB - before.Color.ScB)/(after.Offset - before.Offset) + before.Color.ScB); 

     return color; 
    } 
} 
Các vấn đề liên quan