0

I have a Color class. It has a property model which is a class that implements ColorModel interface, this property could be a RGB, Hex or HSL classes which implementing ColorModel interface.

// Color.php
class Color {

    protected $model;

    public static function factory (Model $model) {
        return new Color($model);
    }

    public function __construct (Model $model) {
        $this->model = $model;
    }

    public function getModel () {
        return $this->model;
    }

    public function set ($color) {
        $this->model->set($color);
    }

    public function raw ($string = false) {
        return $this->model->raw($string);
    }

    public function check (Color $color) {
        return get_class($this->model) === get_class($color->getModel());
    }

    public function isModel ($type) {
        return $type === $this->model->getName();
    }

    // Converter probably suppose to be a strategy which converts color model to another color model
    public function convert (Converter $convert) {
        // I'm stack here...
    }

}

// ColorModel.php
interface ColorModel {

    // Parser is a class which parses input string/int and converts it to components
    public function __construct (Parser $parser, $x, $y, $z);

    public function raw ($string = false);

    public function set ($color);

    public function getName ();

}

I'm not sure how to implement the conversion of ColorModels. How can I implement conversion of those different models without having to create every class for each set (RGB2HSL, HSL2RGB. Let's say I add LAB class four another classes: LAB2RGB, LAB2HSL, HSL2LAB, RGB2LAB, and more, and more)? It's possible at all?

Thank you for attention!

1 Answer 1

2

If you have a ColorModel that can represent all possible colors and that you can convert to without loss of information, then you can designate that ColorModel as the 'canonical' model.

The conversion between arbitrary ColorModels then becomes a two-step process: First you convert from the source model to the canonical model and after that you convert from the canonical model to the target model.

This means that for each ColorModel, you need one Converter that can convert between that model and the canonical model (in both directions). For the canonical model this Converter would implement the identity transformation, so that you don't need special logic if the source or target model happens to be the canonical model.

3
  • Well, that's the exact problem, the colors are completely different. I guess I need create Converter for each of these sets. Thanks anyway! Commented Dec 7, 2014 at 16:19
  • 1
    @volter9: Do you mean you have colors that can't be represented by an RGB value, or colors that would need conversion to represent them in RGB? Commented Dec 7, 2014 at 16:24
  • Well, I didn't thought about representing all colors in RGB... That's actually a great idea. Though there's some problems with gamuts that can have wrong colors after conversion, but there's some other color models that could have more intersecting gamut. For example, instead of RGB -> CMYK, I could increase precision by converting RGB -> LAB -> CMYK Commented Dec 7, 2014 at 17:05

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.