Templateshop - Eine große Auswahl an neuen und modernen Templates für die modified eCommerce Shopsoftware
Neuigkeiten
  • Die modified eCommerce Shopsoftware ist kostenlos, aber nicht umsonst.
    Spenden
  • Damit wir die modified eCommerce Shopsoftware auch zukünftig kostenlos anbieten können:
    Spenden
  • Thema: CMYK Bilder Upload?

    sixtyseven

    • Fördermitglied
    • Beiträge: 107
    • Geschlecht:
    CMYK Bilder Upload?
    am: 30. Dezember 2014, 14:29:57
    Hallo zusammen,

    folgendes Szenario: Ein Kunde pflegt in seinem Shop selbsttätig neue Produkt ein und hat dazu vom Hersteller Bildmaterial bekommen. Die Bilder werden auch ordnungsgemäß hochgeladen, allerdings sind alle Vorschaubilder schwarz. Ich habe mir dann mal die hochgeladenen Bilder näher angesehen und festgestellt, dass es zwar JPEGs waren, diese waren aber im Format CMYK.

    Lässt sich der image_manipulator dahingehend erweitern, dass vor dem Generieren der Vorschaubilder in RGB konvertiert wird?

    Linkback: https://www.modified-shop.org/forum/index.php?topic=31873.0

    h-h-h

    • modified Team
    • Beiträge: 4.562
    Re: CMYK Bilder Upload?
    Antwort #1 am: 30. Dezember 2014, 19:08:36
    Guten Abend,
    du könntest mal folgende Änderung der upload.php testen.

    admin/includes/classes/upload.php
    Suche:
    Code: PHP  [Auswählen]
            if ( ($this->parse() == true) && ($this->save() == true) ) {
    füge danach ein:
    Code: PHP  [Auswählen]
    #hs - mod - CMYK to sRGB - BOC
             if (strpos($this->filename, '.jp') && in_array(strtolower(pathinfo($this->filename, PATHINFO_EXTENSION)), array('jpg','jpeg'))) {
                $i = new Imagick($this->destination . $this->filename);
                if ($i->getImageColorspace() == Imagick::COLORSPACE_CMYK) {
                  $i->setImageColorspace(Imagick::COLORSPACE_SRGB);
                  $i->setImageFormat('jpeg');
                  $i->writeImage($this->destination . $this->filename);
                  $messageStack->add_session('The CMYK image '.$this->filename.' has been converted to RGB', 'success');
                }
              }
    #hs - mod - CMYK to sRGB - EOC

    Viele Grüße,
    h-h-h

    sixtyseven

    • Fördermitglied
    • Beiträge: 107
    • Geschlecht:
    Re: CMYK Bilder Upload?
    Antwort #2 am: 30. Dezember 2014, 20:31:20
    Die Idee mit Imagick kam mir auch schon, hatte etwas ähnliches auf stackoverflow gesehen, mich aber nicht so recht herangewagt.

    Nach dem Einbau deines Codes bleibt die Seite leider weiß. Hab mal das Error Reporting aktiviert, er meckert folgendes:

    Code: XML  [Auswählen]
    Fatal error: Class 'Imagick' not found in admin/includes/classes/upload.php on line 34

    Dann habe ich mal nachgesehen, ob ich Imagick überhaupt auf dem Server habe. In der phpinfo() konnte ich nichts außer der GD finden. Danach habe ich auf stack overflow folgendes Testscript gefunden:

    Code: PHP  [Auswählen]
    function alist ($array) {  //This function prints a text array as an html list.
      $alist = "<ul>";
      for ($i = 0; $i < sizeof($array); $i++) {
        $alist .= "<li>$array[$i]";
      }
      $alist .= "</ul>";
      return $alist;
    }
    exec("convert -version", $out, $rcode); //Try to get ImageMagick "convert" program version number.
    echo "Version return code is $rcode <br>"; //Print the return code: 0 if OK, nonzero if error.
    echo alist($out); //Print the output of "convert -version"

    Scriptoutput wie folgt:

    Code: XML  [Auswählen]
    Version return code is 0

        Version: ImageMagick 6.6.0-4 2014-11-22 Q16 http://www.imagemagick.org
        Copyright: Copyright (C) 1999-2010 ImageMagick Studio LLC
        Features: OpenMP
     

    Sehr merkwürdig. Hast du irgendeine Idee dazu? Auf jeden Fall schon jetzt vielen Dank für deine Mühe!

    sixtyseven

    • Fördermitglied
    • Beiträge: 107
    • Geschlecht:
    Re: CMYK Bilder Upload?
    Antwort #3 am: 30. Dezember 2014, 21:06:05
    Nun, es scheint einmal mehr am Hoster zu liegen:

    Zitat: "Die PECL-Extension imagick ist bei 1&1 WebHosting-Paketen und Managed-Servern nicht installiert."

    Da ich aber wie im vorherigen Post augezeigt, scheinbar per exec() Zugriff auf imagick habe, müsste sich doch da ein kleiner Workaraund bauen lassen, in etwa sowas:

    Code: PHP  [Auswählen]
     #hs - mod - CMYK to sRGB - BOC
    if (strpos($this->filename, '.jp') && in_array(strtolower(pathinfo($this->filename, PATHINFO_EXTENSION)), array('jpg','jpeg'))) {

    if class_exists(' Imagick') {
                    $i = new Imagick($this->destination . $this->filename);
                   
                    if ($i->getImageColorspace() == Imagick::COLORSPACE_CMYK) {
                      $i->setImageColorspace(Imagick::COLORSPACE_SRGB);
                      $i->setImageFormat('jpeg');
                      $i->writeImage($this->destination . $this->filename);
                      $messageStack->add_session('The CMYK image '.$this->filename.' has been converted to RGB', 'success');
                    }
    } else {
           exec( ' Hier fehlt mir der Aufruf' );
    }

    }
    #hs - mod - CMYK to sRGB - EOC

    Bin für jede Idee dankbar.

    sixtyseven

    • Fördermitglied
    • Beiträge: 107
    • Geschlecht:
    Re: CMYK Bilder Upload?
    Antwort #4 am: 30. Dezember 2014, 21:24:04
    Weia, fühlt sich an, als redete ich mit mir selbst  :lol1:

    Folgender Aufruf funltioniert scheinbar:

    Code: PHP  [Auswählen]
    exec("convert -colorspace rgb " . $this->destination . $this->filename . " " . $this->destination . $this->filename);

    Da fehlt mir jetzt natürlich die Abfrage, ob die Datei überhaupt im CMYK Modus ist und die entsprechende Erfolgsmeldung im Falle der Konvertierung. Ich kenne mich leider in Shell commands so gar nicht aus.

    Das generierte JPG scheint zumindest mehr oder weniger ein RGB zu sein :-)

    hpzeller

    • Experte
    • Beiträge: 4.129
    • Geschlecht:
    Re: CMYK Bilder Upload?
    Antwort #5 am: 30. Dezember 2014, 21:26:44
    Hallo sixtyseven

    Es scheint so zu sein, dass die PECL-Extension 'imagick' nicht installiert ist, dafür aber das Programm 'ImageMagick', so entnehme ich es jedenfalls deinen Postings.

    Mit 'ImageMagick' kann man natürlich Bilder auf dem Server noch umfangreicher manipulieren als mit der PECL-Extension 'imagick', die ja nur eine abgespeckte PHP-Erweiterung von ImageMagick ist.

    Gruss
    Hanspeter

    h-h-h

    • modified Team
    • Beiträge: 4.562
    Re: CMYK Bilder Upload?
    Antwort #6 am: 30. Dezember 2014, 21:28:26
    putenv('MAGICK_THREAD_LIMIT=1'); vor den Code hast du schon geprüft?

    Code: PHP  [Auswählen]
    #hs - mod - CMYK to RGB v2 - EOC
    if (strpos($this->filename, '.jp') && in_array(strtolower(pathinfo($this->filename, PATHINFO_EXTENSION)), array('jpg','jpeg'))) {
      $cfile = $this->destination . $this->filename;
      $gis = getimagesize($cfile);
      if ($gis['channels'] == 4) {  
        exec("convert $cfile -colorspace rgb $cfile");
       //http://www.imagemagick.org/script/command-line-options.php#colorspace
        $messageStack->add_session('The CMYK image '.$this->filename.' has been converted to RGB', 'success');
      }
    }
    #hs - mod - CMYK to RGB v2 - EOC

    Viele Grüße,
    h-h-h

    EDIT: :)

    sixtyseven

    • Fördermitglied
    • Beiträge: 107
    • Geschlecht:
    Re: CMYK Bilder Upload?
    Antwort #7 am: 30. Dezember 2014, 21:50:30
    Aaaaah jetzt ja, da kommen wir der Sache doch schon näher.

    Gibt's zu
    Code: PHP  [Auswählen]
    exec("convert $cfile -colorspace rgb $cfile");
    auch eine Rückgabe im Erfolgsfall? Dann könnte man die Meldung noch entsprechend tunen und im Fehlerfall (CMYK kann nicht nach RGB konvertiert werden, aber die Datei ist definitiv in cmyk) eine entsprechende Meldung ausgeben, den User auf das Bilderproblem hinweisen und aus der insert Routine aussteigen.

    Und weil ja gerade Weihnachten war wünsche ich mir noch schnell was: Wir sind ja gerade genau in der Upload Routine. Könnte man hier nicht auch noch eine Resize-Funktion einbauen, die diese unsäglichen 3 MB Kundenbilder auf sagen wir 1200 Pixel Breite herunterrechnet?

    Eine Sache möchte ich noch schnell loswerden: Ich bin total begeistert, wie gut dieses Forum funktioniert. Sogar bei einem solchen Fall. Und das ist beileibe kein Schleimen, sondern meine ehrliche Meinung. Klar, man sollte schon ein bischen Eigeninitiative zeigen, vorab mal ein wenig im Forum suchen und vor allem so clever sein, seine Problemlösung auch mit anderen zu teilen. Ich freue mich jedenfalls, ein Teil dieser Community zu sein.

    h-h-h

    • modified Team
    • Beiträge: 4.562
    Re: CMYK Bilder Upload?
    Antwort #8 am: 30. Dezember 2014, 21:55:09
    Code: PHP  [Auswählen]
        exec("convert $cfile -colorspace rgb $cfile", $output);
        $output_str = var_export($output, true);

    Ich habe keine Ahnung was da raus kommen könnte. :)

    Füge doch einfach mal .$output_str vor , 'success'); ein.

    LG, h-h-h

    sixtyseven

    • Fördermitglied
    • Beiträge: 107
    • Geschlecht:
    Re: CMYK Bilder Upload?
    Antwort #9 am: 30. Dezember 2014, 22:16:54
    $output ist ein leeres Array, aber wir sind auf jeden Fall auf der richtigen Spur. In der Testfunktion stand ja
    Code: XML  [Auswählen]
    //Print the return code: 0 if OK, nonzero if error
    . Daher sollte folgendes funktionieren:

    Code: PHP  [Auswählen]
    #hs - mod - CMYK to RGB v2 - EOC
                            if (strpos($this->filename, '.jp') && in_array(strtolower(pathinfo($this->filename, PATHINFO_EXTENSION)), array('jpg','jpeg'))) {
                              $cfile = $this->destination . $this->filename;
                              $gis = getimagesize($cfile);
                              if ($gis['channels'] == 4) {  
                                    exec("convert $cfile -colorspace rgb $cfile", $output, $responsecode);
                                    if($responsecode > 0){
                                        $messageStack->add_session('The CMYK image '.$this->filename.' has been converted to RGB', 'success');
                                   } else {
                                        $messageStack->add_session('The CMYK image '.$this->filename.' could not be converted to RGB', 'error');
                                  }
                              }
                            }
                            #hs - mod - CMYK to RGB v2 - EOC
     

    sixtyseven

    • Fördermitglied
    • Beiträge: 107
    • Geschlecht:
    Re: CMYK Bilder Upload?
    Antwort #10 am: 30. Dezember 2014, 22:29:29
    Läuft! Hier mal meine komplette Funktion upload:

    Code: PHP  [Auswählen]
    function upload($file = '', $destination = '', $permissions = '644', $extensions = '', $mime_types='') {
              global $messageStack;

          $this->set_file($file);
          $this->set_destination($destination);
          $this->set_permissions($permissions);
          $this->set_extensions($extensions);

          if (xtc_not_null($this->file) && xtc_not_null($this->destination)) {
            if ( ($this->parse() == true) && ($this->save() == true) ) {

                            #hs - mod - CMYK to RGB v2 - EOC
                            if (strpos($this->filename, '.jp') && in_array(strtolower(pathinfo($this->filename, PATHINFO_EXTENSION)), array('jpg','jpeg'))) {
                              $cfile = $this->destination . $this->filename;
                              $gis = getimagesize($cfile);
                              if ($gis['channels'] == 4) {  
                                   
                                    $cmyk_fail = 1;
                                   
                                    if(class_exists('Imagick')){
                                             $i = new Imagick($cfile);
                                             $i->setImageColorspace(Imagick::COLORSPACE_SRGB);
                             $i->setImageFormat('jpeg');
                                             if($i->writeImage($this->destination . $this->filename)){
                                                     $cmyk_fail = 0;
                                             }
                                    } else {
                                            exec("convert $cfile -colorspace rgb $cfile", $output, $responsecode);
                                            $cmyk_fail = $responsecode;
                                    }
                                   
                                    if($cmyk_fail > 0) {   
                                            $messageStack->add_session('The CMYK image '.$this->filename.' could not been converted to RGB', 'success');
                                            return false;
                                    } else {
                                            $messageStack->add_session('The CMYK image '.$this->filename.' has been converted to RGB', 'error');
                                            return true;
                                    }
                              }
                            }
                            #hs - mod - CMYK to RGB v2 - EOC
                           
              return true;
            } else {
              return false;
            }
          }
        }
     

    Klasse!

     :thx:

    h-h-h

    • modified Team
    • Beiträge: 4.562
    Re: CMYK Bilder Upload?
    Antwort #11 am: 30. Dezember 2014, 22:38:48
    Zitat
    Könnte man hier nicht auch noch eine Resize-Funktion einbauen, die diese unsäglichen 3 MB Kundenbilder auf sagen wir 1200 Pixel Breite herunterrechnet?

     :hust: i know

    Sieht gut aus.  :thumbs:

    Eventuell noch die Datei löschen(unlink) vor dem return false;

    Gruß, h-h-h

    sixtyseven

    • Fördermitglied
    • Beiträge: 107
    • Geschlecht:
    Re: CMYK Bilder Upload?
    Antwort #12 am: 30. Dezember 2014, 23:05:47
    Na dann machen wir hieraus doch mal eine brauchbare Lösung für alle ;-)

    Schritt 1:
    Öffne admin/includes/classes/upload.php Suche dort die funktion upload (Zeile 22 ff) und ersetze sie komplett mit diesem Code:
    Code: PHP  [Auswählen]
    function upload($file = '', $destination = '', $permissions = '644', $extensions = '', $mime_types='') {
              global $messageStack;

          $this->set_file($file);
          $this->set_destination($destination);
          $this->set_permissions($permissions);
          $this->set_extensions($extensions);

          if (xtc_not_null($this->file) && xtc_not_null($this->destination)) {
            if ( ($this->parse() == true) && ($this->save() == true) ) {

                            #Convert CMYK JPG to RGB JPG by h-h-h && sixtyseven - BOC
                            if (strpos($this->filename, '.jp') && in_array(strtolower(pathinfo($this->filename, PATHINFO_EXTENSION)), array('jpg','jpeg'))) {
                              $cfile = $this->destination . $this->filename;
                              $gis = getimagesize($cfile);
                              if ($gis['channels'] == 4) {  
                                   
                                    $cmyk_fail = 1;
                                   
                                    if(class_exists('Imagick')){
                                             $i = new Imagick($cfile);
                                             $i->setImageColorspace(Imagick::COLORSPACE_SRGB);
                             $i->setImageFormat('jpeg');
                                             if($i->writeImage($this->destination . $this->filename)){
                                                     $cmyk_fail = 0;
                                             }
                                    } else {
                                            exec("convert $cfile -colorspace rgb $cfile", $output, $responsecode);
                                            $cmyk_fail = $responsecode;
                                    }
                                   
                                    if($cmyk_fail > 0) {   
                                            $messageStack->add_session(sprintf(CMYK_CONVERTED_SUCCESS, $this->filename), 'error');
                                            unlink($cfile);
                                            return false;
                                    } else {
                                            $messageStack->add_session(sprintf(CMYK_CONVERTED_ERROR, $this->filename), 'success');
                                            return true;
                                    }
                              }
                            }
                            #Convert CMYK JPG to RGB JPG by h-h-h && sixtyseven - EOC
                           
              return true;
            } else {
              return false;
            }
          }
        }

    Schritt 2: Öffne lang/german/admin/german.php Füge dort ans Ende dies hier ein:
    Code: PHP  [Auswählen]
    //CMYK convert by h-h-h && sixtyseven
    define('CMYK_CONVERTED_SUCCESS', 'Das CMYK Bild %s wurde erfolgreich zu RGB konvertiert');
    define('CMYK_CONVERTED_ERROR', 'Das CMYK Bild %s konnte nicht zu RGB konvertiert werden, das Produkt wurde nicht angelegt!');

    Schritt 3: Verfahre analog dazu mit allen Sprachen, de du im Backend verwendest. Exemplarisch hier die englische Version:
    Code: PHP  [Auswählen]
    //CMYK convert by h-h-h && sixtyseven
    define('CMYK_CONVERTED_SUCCESS', 'The CMYK image %s has been converted to RGB.');
    define('CMYK_CONVERTED_ERROR', 'The CMYK image %s could not be converted to RGB. The product was not created!');

    Also ich finde das gar nicht schlecht so kurz vorm Jahresende. Wenn jetzt noch die Sache mit dem Resize ...

     :mrgreen:

    sixtyseven

    • Fördermitglied
    • Beiträge: 107
    • Geschlecht:
    Re: CMYK Bilder Upload?
    Antwort #13 am: 01. Januar 2015, 17:26:42
    So, ich habe mich heute nochmal an den Bildupload gemacht und nun auch die Sache mit der Bildgröße in den Griff bekommen. Es lassen sich nunmehr im Backend maximale Bildbreite und -höhe in Pixeln sowie ein Qualitätsfaktor beim Skalieren festlegen. Sollte das hochgeladene Bild höher oder breiter als die vorgegebenen Werte sein, wird dieses verzerrungsfrei auf entsprechende Maße heruntergerechnet. Durch die Eingabe von 0 bei Breite und/oder Höhe wird dieses Feature deaktiviert.

    in der Datei languages/german/admin/configuration.php am Ende einfügen:
    Code: PHP  [Auswählen]
    // max image dimensions by sixtyseven
    define('SS_IMAGE_MAXWIDTH_TITLE' ,   'Maximale Breite Bildupload');
    define('SS_IMAGE_MAXWIDTH_DESC' ,    'Wie breit in Pixeln d&uuml;rfen hochgeladene Bilder maximal sein? Ziffer 0 eingeben, um dieses Feature zu deaktivieren.');
    define('SS_IMAGE_MAXHEIGHT_TITLE' ,   'Maximale H&ouml;he Bildupload');
    define('SS_IMAGE_MAXHEIGHT_DESC' ,    'Wie hoch in Pixeln d&uuml;rfen hochgeladene Bilder maximal sein? Ziffer 0 eingeben, um dieses Feature zu deaktivieren.');
    define('SS_IMAGE_QUALITY_TITLE' ,   'Bildqualit&auml;t');
    define('SS_IMAGE_QUALITY_DESC' ,    'Wie hoch soll die Qualit&auml;t bei der Bildskalierung sein? (0 = Schlechte Qualit&auml;t, daf&uuml;r sehr kleine Datei, 100 = Beste Qualit&auml;t, aber gr&ouml;&szlig;ere Datei)');
     

    in der Datei languages/german&admin/german.php am Ende einfügen:
    Code: PHP  [Auswählen]
    // CMYK convert by h-h-h && sixtyseven
    define('CMYK_CONVERTED_SUCCESS', 'Das CMYK Bild %s wurde erfolgreich zu RGB konvertiert');
    define('CMYK_CONVERTED_ERROR', 'Das CMYK Bild %s konnte nicht zu RGB konvertiert werden, das Produkt wurde nicht angelegt!');

    // image resize by sixtyseven
    define('SS_IMAGE_RESIZE_SUCCESS','Das Bild wurde von ursprünglich %s x %s Pixeln auf %s x %s Pixel skaliert.');

    Die Datei admin/includes/classes/upload.php mit der geänderten upload.php aus der Verzeichnisstruktur der angehängten ZIP-Datei überschreiben.

    In der Datenbank folgendes SQL-Statement ausführen:
    Code: SQL  [Auswählen]
     INSERT INTO `configuration` (
     `configuration_key` ,
     `configuration_value` ,
     `configuration_group_id` ,
     `sort_order` ,
     `set_function`
     )
     VALUES
    ('SS_IMAGE_MAXWIDTH', '1200', '3', '60', NULL),
    ('SS_IMAGE_MAXHEIGHT', '1024', '3', '60', NULL),
    ('SS_IMAGE_QUALITY', '100', '3', '60', NULL)

    Viel Vergnügen und ein erfolgreiches Jahr 2015 wünscht sixtyseven. Noch einmal recht herzlichen Dank an h-h-h für die Unterstützung bei der CMYK-Konvertierung.
    0 Antworten
    2766 Aufrufe
    28. November 2011, 10:28:27 von Da Sandro
    15 Antworten
    6508 Aufrufe
    24. April 2009, 16:23:24 von Anonym
    4 Antworten
    3995 Aufrufe
    28. September 2012, 15:20:01 von kingarthur_2
    1 Antworten
    1046 Aufrufe
    20. November 2018, 15:54:50 von Chopper-Fahrer