Witam, zaczynam się bawić Javą i chciałbym przekształcić kolory wczytanego obrazka z RGB na HSL. Niestety, nie za bardzo wiem, jak to zrobić - chodzi o poprawne odwołanie.
Mój poniższy kod robi jedną rzecz - wczytuje obrazek o podanej nazwie. Co dodać, jak się odwołać do obrazka, żeby zmienić kolory?
Proszę przy okazji o poprawki kodu - jak widzicie, że coś jest bzdurą, to napiszcie, żebym się później nie zaplątał w trakcie rozbudowywania programu. :>

import java.util.Scanner;
import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;
import java.awt.Color;
import java.awt.BasicStroke;
import java.io.*;
import java.awt.image.*;
import javax.imageio.*;

public class Zadanie2a 
{
    static JFrame ramka;
    private static Scanner in; 
    public static void main(String[] args) 
    {
        in = new Scanner(System.in);
        Zadanie2a zadanie = new Zadanie2a();
        zadanie.GUI();

        String         image_name; 
        BufferedImage  input_image;
        int img_width, img_height;      
        input_image = null;
        System.out.println( "Podaj nazwę pliku: " );        
        image_name = readStr();

        try 
        {
            input_image = ImageIO.read( new File( image_name ) );
        }    
        catch (IOException e) {
                    System.out.println("Błąd odczytu obrazka.");
                }

        img_height = input_image.getHeight();
        img_width  = input_image.getWidth();    
        Graphics g = ramka.getGraphics();
        Graphics2D g2d = (Graphics2D) g;  
        g2d.drawImage( input_image, 60, 60, null);

        System.out.println( "Wciśnij jakiś klawisz, aby zakończyć. ");
        readln();
        System.exit(0);
    }

        public void GUI()
        {
            ramka = new JFrame();
            ramka.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
            ramka.getContentPane().add(new MojPanelRysunkowy());
            ramka.setSize( 800, 700 );
            ramka.setVisible(true);
        }

        class MojPanelRysunkowy  extends JPanel
        {
           MojPanelRysunkowy()
           {
               super();

               setBackground( new Color( 200, 200, 200) );
               JButton button = new JButton();
               button.setLocation( 100, 100 );       
                // add( button );
               button.setVisible( true );   
           }

           public void paintComponent( Graphics g)
           {
               super.paintComponent(g);  
           }
        }

    static void readln()
    {
        try
        {
           while( System.in.read() != '\n' );
        }
        catch( Throwable obj )
        {
        }
    }

    static String readStr() {
       return in.next(); 
    }   

    static int readInt()
    {
        return (in.nextInt());          
    }
}

Poniżej znajduje się kod (znaleziony w Internecie - nie wiem, czy dobry) zmieniający RGB do HSL:

private void rgb2hsl(int r, int g, int b, int hsl[]) {

        float var_R = ( r / 255f );                    
        float var_G = ( g / 255f );
        float var_B = ( b / 255f );

        float var_Min;    //Min. value of RGB
        float var_Max;    //Max. value of RGB
        float del_Max;    //Delta RGB value

        if (var_R > var_G) 
            { var_Min = var_G; var_Max = var_R; }
        else 
            { var_Min = var_R; var_Max = var_G; }

        if (var_B > var_Max) var_Max = var_B;
        if (var_B < var_Min) var_Min = var_B;

        del_Max = var_Max - var_Min; 

        float H = 0, S, L;
        L = ( var_Max + var_Min ) / 2f;

        if ( del_Max == 0 ) { H = 0; S = 0; } // gray
        else {                                //Chroma
            if ( L < 0.5 ) 
                S = del_Max / ( var_Max + var_Min );
            else           
                S = del_Max / ( 2 - var_Max - var_Min );

            float del_R = ( ( ( var_Max - var_R ) / 6f ) + ( del_Max / 2f ) ) / del_Max;
            float del_G = ( ( ( var_Max - var_G ) / 6f ) + ( del_Max / 2f ) ) / del_Max;
            float del_B = ( ( ( var_Max - var_B ) / 6f ) + ( del_Max / 2f ) ) / del_Max;

            if ( var_R == var_Max ) 
                H = del_B - del_G;
            else if ( var_G == var_Max ) 
                H = ( 1 / 3f ) + del_R - del_B;
            else if ( var_B == var_Max ) 
                H = ( 2 / 3f ) + del_G - del_R;
            if ( H < 0 ) H += 1;
            if ( H > 1 ) H -= 1;
        }
        hsl[0] = (int)(360*H);
        hsl[1] = (int)(S*100);
        hsl[2] = (int)(L*100);
    }

Jak to połączyć, żeby było dobrze? ;-)