2008-08-26 44 views
26

Với 2 màu rgb và một vùng hình chữ nhật, tôi muốn tạo ra một gradient tuyến tính cơ bản giữa các màu. Tôi đã thực hiện tìm kiếm nhanh và điều duy nhất tôi có thể tìm thấy là this blog entry, nhưng mã ví dụ dường như bị thiếu hoặc ít nhất là do bài đăng này. Bất cứ điều gì giúp, các thuật toán, ví dụ mã, bất cứ điều gì. Điều này sẽ được viết bằng Java, nhưng lớp hiển thị đã được xử lý, tôi chỉ cần tìm ra cách để tìm ra những gì để hiển thị.Tạo gradients theo lập trình?

Trả lời

35

bạn muốn có nội suy giữa màu đầu tiên và màu thứ hai. Việc nội suy màu sắc dễ dàng bằng cách tính toán cùng một nội suy cho mỗi thành phần của nó (R, G, B). Có nhiều cách để nội suy. Cách đơn giản nhất là sử dụng phép nội suy tuyến tính: chỉ cần lấy tỷ lệ p màu đầu tiên và tỷ lệ phần trăm 1-p của thứ hai:

R = firstCol.R * p + secondCol.R * (1 - p) 

another question liên quan đến này.

Có các phương pháp nội suy khác đôi khi hoạt động tốt hơn. Ví dụ: sử dụng hàm nội suy bell-shaped (sigmoidal) làm cho quá trình chuyển đổi mượt mà hơn.

/EDIT: Rất tiếc, bạn có nghĩa là sử dụng hàm được xác định trước. OK, thậm chí dễ dàng hơn. Bài đăng trên blog bạn đã liên kết hiện có mã ví dụ bằng Python.

Trong Java, bạn có thể sử dụng GradientPaint.

+2

Trong Java 1.6 và lên, đó cũng là LinearGradientPaint đó cho phép kiểm soát tốt hơn cách nó được sơn. Xem http://java.sun.com/javase/6/docs/api/java/awt/LinearGradientPaint.html – Avrom

7

Sử dụng các lớp AWT cơ bản, bạn có thể làm một cái gì đó như thế này:

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.geom.Rectangle2D; 
import javax.swing.JPanel; 

public class LinearGradient extends JPanel { 

    public void paint(Graphics g) { 
     Graphics2D g2 = (Graphics2D) g; 
     Color color1 = Color.RED; 
     Color color2 = Color.BLUE; 
     int steps = 30; 
     int rectWidth = 10; 
     int rectHeight = 10; 

     for (int i = 0; i < steps; i++) { 
      float ratio = (float) i/(float) steps; 
      int red = (int) (color2.getRed() * ratio + color1.getRed() * (1 - ratio)); 
      int green = (int) (color2.getGreen() * ratio + color1.getGreen() * (1 - ratio)); 
      int blue = (int) (color2.getBlue() * ratio + color1.getBlue() * (1 - ratio)); 
      Color stepColor = new Color(red, green, blue); 
      Rectangle2D rect2D = new Rectangle2D.Float(rectWidth * i, 0, rectWidth, rectHeight); 
      g2.setPaint(stepColor); 
      g2.fill(rect2D); 
     } 
    } 
} 
10

Bạn có thể sử dụng được xây dựng trong GradientPaint lớp.

void Paint(Graphics2D g, Regtangle r, Color c1, Color c2) 
{ 
    GradientPaint gp = new GradientPaint(0,0,c1,r.getWidth(),r.getHeight(),c2); 
    g.setPaint(gp); 
    g.fill(rect); 
} 
0

Tôi đã sử dụng RMagick for that. Nếu bạn cần phải đi xa hơn các gradient đơn giản, ImageMagick và một trong các trình bao bọc của nó (như RMagick hoặc JMagick cho Java) có thể hữu ích.

+0

Trang không khả dụng ........ – hyprfrcb

1

Theo dõi trên câu trả lời Execllent của David Crow, đây là một ví dụ Kotlin thực hiện

fun gradientColor(x: Double, minX: Double, maxX: Double, 
        from: Color = Color.RED, to: Color = Color.GREEN): Color { 
    val range = maxX - minX 
    val p = (x - minX)/range 

    return Color(
     from.red * p + to.red * (1 - p), 
     from.green * p + to.green * (1 - p), 
     from.blue * p + to.blue * (1 - p), 
     1.0 
    ) 
} 
Các vấn đề liên quan