UIColor mit CMYK Color Space?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • UIColor mit CMYK Color Space?

    Ich möchte eine UIColor mit einem CMYK Color Space, welche ich über eine CGColor erstellt habe, mit einem NSKeyedArchiver speichern. Leider gibt es dabei diese Fehlermeldung in der Console:

    Quellcode

    1. *** Assertion failure in -[UICGColor encodeWithCoder:], /SourceCache/UIKit/UIKit-738/UIColor.m:577
    2. CoreAnimation: ignoring exception: Only support RGBA or the White color space, this method is a hack.
    NSColor bietet die Möglichkeit eine Farbe in einen anderen ColorSpace zu konvertieren. Soweit scheint die iPhoneOS Crew jedoch noch nicht zu sein, da ich diese Möglichkeit für UIColor bisher noch nicht gefunden habe.

    Hat jemand eine Idee wie ich meine UIColor mit einem CMYK Color Space in den RGBA Color Space konvertieren kann, oder wie ich dieses UIColor Objekt mit einem NSKeyedArchiver speichern kann?

    Kann ich evtl. eine Category für UICGColor definieren und darin die Methoden encodeWithCoder: und initWithCode: "überschreiben"?
  • Farbräume und Farbträume

    Original von MCDan
    Ich möchte eine UIColor mit einem CMYK Color Space, welche ich über eine CGColor erstellt habe, mit einem NSKeyedArchiver speichern. Leider gibt es dabei diese Fehlermeldung in der Console:

    Quellcode

    1. *** Assertion failure in -[UICGColor encodeWithCoder:], /SourceCache/UIKit/UIKit-738/UIColor.m:577
    2. CoreAnimation: ignoring exception: Only support RGBA or the White color space, this method is a hack.
    NSColor bietet die Möglichkeit eine Farbe in einen anderen ColorSpace zu konvertieren. Soweit scheint die iPhoneOS Crew jedoch noch nicht zu sein, da ich diese Möglichkeit für UIColor bisher noch nicht gefunden habe.

    Hat jemand eine Idee wie ich meine UIColor mit einem CMYK Color Space in den RGBA Color Space konvertieren kann, oder wie ich dieses UIColor Objekt mit einem NSKeyedArchiver speichern kann?

    Das wirst Du wohl zu Fuss machen müssen, indem Du die Komponenten benutzt, etwa so:

    Quellcode

    1. r = 1 - MIN(1, c * (1 - black) / black);
    2. g = 1 - MIN(1, m * (1 - black) / black);
    3. b = 1 - MIN(1, y * (1 - black) / black);


    Bleibt die Frage, ob es Dir nur um die Farbe geht (die ich dann so in eine "ordentliche" RGB-Farbe wandeln würde.), oder tatsächlich um den Farbraum. Dann wäre die Frage warum, und wie ließe sich das vermeiden.
    Original von MCDan

    Kann ich evtl. eine Category für UICGColor definieren und darin die Methoden encodeWithCoder: und initWithCode: "überschreiben"?


    Kennen wir denn "UICGColor" überhaupt? Nicht offiziell zumindest. Oder kann man die Kodierungsmethoden tatsächlich in einer 'Category' überschreiben? Doch eigentlich weniger, man kann es versuchen ;)

    Ich denke, wenn Du Deine CGColor aus dem CMYK-Farbraum gewandelt hast, bist auf dem Telefon im grünen (RGB: 0,1,0 CMYK:1,0,1,0) Bereich.
    I would be embarrassed if they did not spy on me.
  • Hehehehe, das hatten wir schon Delft mit Daniel besprochen …

    Man muss nicht einmal umwandeln. Man kann einfach die Komponenten vertauschen: Hauptsache man tauscht beim Laden richtig zurück.

    Noch zum Überschreiben mit Kategorien: Probieren ist da ein heikles Thema, weil es AFAIK derzeit noch geht, allerdings als ICH TÖTE DICH, WENN DU ES NOCH EINMAL TUST! markiert ist.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Original von Tom9811
    Hehehehe, das hatten wir schon Delft mit Daniel besprochen …

    Man muss nicht einmal umwandeln. Man kann einfach die Komponenten vertauschen: Hauptsache man tauscht beim Laden richtig zurück.

    Nicht ganz, weil CMYK eine Komponente mehr hat.
    Aber wir haben ja auch noch HSB.
    Da gibt es bestimmt genauso eine lustige Meldung.
    Original von Tom9811
    Noch zum Überschreiben mit Kategorien: Probieren ist da ein heikles Thema, weil es AFAIK derzeit noch geht, allerdings als ICH TÖTE DICH, WENN DU ES NOCH EINMAL TUST! markiert ist.


    Auf solche Ideen würde ich beim Interpretieren der Fehlermeldung auch kommen.
    I would be embarrassed if they did not spy on me.
  • Original von longW
    Original von Tom9811
    Hehehehe, das hatten wir schon Delft mit Daniel besprochen …

    Man muss nicht einmal umwandeln. Man kann einfach die Komponenten vertauschen: Hauptsache man tauscht beim Laden richtig zurück.

    Nicht ganz, weil CMYK eine Komponente mehr hat.

    CoreAnimation: ignoring exception: Only support RGBA or the White color space,
    Noch nie probiert, sollte aber kein Problem sein.

    Original von longW
    Aber wir haben ja auch noch HSB.
    Da gibt es bestimmt genauso eine lustige Meldung.
    Original von Tom9811
    Noch zum Überschreiben mit Kategorien: Probieren ist da ein heikles Thema, weil es AFAIK derzeit noch geht, allerdings als ICH TÖTE DICH, WENN DU ES NOCH EINMAL TUST! markiert ist.


    Auf solche Ideen würde ich beim Interpretieren der Fehlermeldung auch kommen.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • RE: UIColor mit CMYK Color Space?

    Jetzt habe ich Dein Problem, und die Idee mit der 'Category' erst richtig verstanden. Wenn das Problem seit Delft akut ist, und weil ich mich auch schon an CYM gestoßen habe, habe ich das mal probiert.
    So dumm ist das gar nicht, wenn das 'Coding'-Protokoll nur in der Superklasse implementiert ist. Mit einer 'Category' kommst Du vielleicht irgendwo ran.

    Ich habe das mal probiert:

    Quellcode

    1. @implementation UIColor (UIColorCMYKAddition)
    2. - (void)encodeWithCoder:(NSCoder *)encoder
    3. {
    4. CGColorRef myColor = [self CGColor];
    5. CGColorSpaceRef colorSpace = CGColorGetColorSpace(myColor);
    6. size_t count = CGColorGetNumberOfComponents([self CGColor]);
    7. NSLog(@"count %d", count);
    8. // if(count > 4) // condition for CMYK, maybe others
    9. [super encodeWithCoder:encoder];
    10. }
    11. @end
    Alles anzeigen

    Abgesehen davon, dass das Protokoll nicht vollständig implementiert ist, -initWithCoder knallt, wenn man es einsetzt, deswegen habe ich es nicht gemacht, gibt es noch die Warnung, das NSObject -encodeWithCoder auch nicht kennt (wg. dem Aufruf nach super), nur nebenbei.
    Tom9811 hat ja schon gewarnt, das ist etwas, das man das nicht tun möchte.
    Kamikaze ist dagegen eine Verlängerung der Lebenserwartung.

    Aber egal, der Wein wird es richten…

    Interessant ist, was passiert

    Quellcode

    1. - (void)applicationDidFinishLaunching:(UIApplication *)application {
    2. NSMutableData *data = [NSMutableData data];
    3. NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
    4. float components[5] = { 0, 0, 1, 1, 1};
    5. // CGColorSpaceRef myColorspace = CGColorSpaceCreateDeviceCMYK();
    6. /*Error:
    7. 2008-12-18 15:56:44.733 ViewBased[7572:20b] count 5
    8. 2008-12-18 15:56:44.735 ViewBased[7572:20b] *** -[UICGColor encodeWithCoder:]: unrecognized selector sent to instance 0x529cb0
    9. 2008-12-18 15:56:44.736 ViewBased[7572:20b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[UICGColor encodeWithCoder:]: unrecognized selector sent to instance 0x529cb0'
    10. */
    11. // CGColorSpaceRef myColorspace = CGColorSpaceCreateDeviceGray();
    12. /*Error:
    13. 2008-12-18 16:00:20.415 ViewBased[7623:20b] count 2
    14. 2008-12-18 16:00:20.416 ViewBased[7623:20b] *** -[UIDeviceWhiteColor encodeWithCoder:]: unrecognized selector sent to instance 0x529ca0
    15. 2008-12-18 16:00:20.418 ViewBased[7623:20b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[UIDeviceWhiteColor encodeWithCoder:]: unrecognized selector sent to instance 0x529ca0'
    16. */
    17. CGColorSpaceRef myColorspace = CGColorSpaceCreateDeviceRGB();
    18. /*Error:
    19. 2008-12-18 16:02:15.219 ViewBased[7661:20b] count 4
    20. 2008-12-18 16:02:15.220 ViewBased[7661:20b] *** -[UIDeviceRGBColor encodeWithCoder:]: unrecognized selector sent to instance 0x50b180
    21. 2008-12-18 16:02:15.222 ViewBased[7661:20b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[UIDeviceRGBColor encodeWithCoder:]: unrecognized selector sent to instance 0x50b180'
    22. */
    23. UIColor * color = [UIColor colorWithCGColor:CGColorCreate(myColorspace, components)];
    24. [archiver encodeObject:color forKey:@"MyCMYKColor"];
    25. [archiver finishEncoding];
    26. [data writeToFile:@"/tmp/LetsSee" atomically:YES];
    27. [archiver release];
    28. }
    Alles anzeigen

    Der Einfachheit halber habe ich die Fehlermeldungen in den Code kopiert, und lasse es auch so.
    Es geht einfach nicht. UIColor ist nicht eine direkte Unterklasse von UICGColor(wenn die inoffiziellen Informationen stimmen), sondern entweder UIDeviceRGBColor oder UIDeviceWhiteColor dazwischen sitzt. Ein echtes class-cluster wie es aussieht.

    Es muss sich also jemand UIDeviceCYMKColor kümmern.

    Was Dir bleibt, ist noch von UIColor eine Unterklasse erzeugen und darin -encodeWithCoder: überschreiben und die Zahl der Komponenten abfragen, wie schon gezeigt. Das wäre ein Weg.

    Der Punkt ist aber, brauchst Du die Farbe, oder den Farbraum. Wenn Du den Farbraum nicht nach hinten brauchst, würde ich sofort alles nach RGB umwandeln, und gut ist.
    I would be embarrassed if they did not spy on me.