سؤال

نظرًا لوجود لونين rgb ومساحة مستطيلة، أرغب في إنشاء تدرج خطي أساسي بين الألوان.لقد أجريت بحثًا سريعًا والشيء الوحيد الذي تمكنت من العثور عليه هو هذا الإدخال بلوق, ، ولكن يبدو أن رمز المثال مفقود، أو على الأقل كان كذلك اعتبارًا من هذا النشر.أي شيء يساعد، الخوارزميات، أمثلة التعليمات البرمجية، أي شيء.ستتم كتابة هذا بلغة Java، ولكن تم الاهتمام بطبقة العرض بالفعل، وأحتاج فقط إلى معرفة كيفية معرفة ما سيتم عرضه.

هل كانت مفيدة؟

المحلول

تريد الاستيفاء بين اللون الأول والثاني.يعد استيفاء الألوان أمرًا سهلاً عن طريق حساب نفس الاستيفاء لكل مكون من مكوناته (R، G، B).هناك طرق عديدة للتحريف.الأسهل هو استخدام الاستيفاء الخطي:فقط خذ النسبة المئوية ص من اللون الأول والنسبة 1 - ص من الثاني:

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

هناك سؤال آخر متعلق بهذا.

هناك طرق أخرى للاستيفاء تعمل بشكل أفضل في بعض الأحيان.على سبيل المثال، باستخدام أ على شكل جرس (السيني) وظيفة الاستيفاء تجعل الانتقال أكثر سلاسة.

/يحرر:عفوًا، تقصد استخدام وظيفة محددة مسبقًا.حسنا، حتى أسهل.تحتوي مشاركة المدونة التي قمت بربطها الآن على رمز مثال في Python.

في جافا، يمكنك استخدام GradientPaint.

نصائح أخرى

يمكنك استخدام المدمج في GradientPaint فصل.

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);
}

باستخدام فئات AWT الأساسية، يمكنك القيام بشيء مثل هذا:

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);
        }
    }
}

متابعة للإجابة الممتازة لديفيد كرو، إليك مثال لتطبيق Kotlin

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
    )
}

لقد تم استخدام RMagic لذلك.إذا كنت بحاجة إلى المضي قدمًا في التدرج البسيط، فإن ImageMagick وأحد أغلفةه (مثل RMagick أو JMagick لـ Java) قد يكون مفيدًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top