2016-11-08 1 views
0

Utilisation de la plateforme de commerce électronique OpenCart (basée sur PHP/MySQL).OpenCart - comment désactiver le système de mise en cache de l'image?

Problème: la mise en cache d'image est TERRIBLE. Non seulement les images sortent avec une qualité visiblement dégradée, mais la taille d'image "mise en cache" est en réalité plus grande. Donc, échouez sur les deux fronts.

Est-ce que quelqu'un sait comment désactiver complètement le cache d'image dans OpenCart 2.0.3.1?

+1

vous pouvez définir la taille de l'image dans les paramètres d'image admin. assurez-vous que vos images d'origine ont au moins autant de pixels que ce que vous redimensionnez et que la qualité sera bonne. – billynoah

+0

Je ne parle pas de changer la taille de l'image. Ce n'est pas le problème. Le problème que le moteur de cache OC RUINS la qualité d'image. Même si l'original est de 2X-5X-10X la résolution, le résultat final est horrible. – TomJones999

+0

Cela n'a pas été mon expérience Tom. Pouvez-vous s'il vous plaît poster une comparaison d'image côte à côte pour illustrer le problème que vous voyez? – billynoah

Répondre

1

Merci Tom. Je vais aborder quelques points concernant votre exemple, puis je vais essayer de répondre à votre question. (1) Une image ne sera jamais transcodée si elle est exactement la même taille que l'image demandée. Voir la ligne 28 du catalogue/modèle/outil/image.php où le bloc lit:

if ($width_orig != $width || $height_orig != $height) { 
    $image = new Image(DIR_IMAGE . $old_image); 
    $image->resize($width, $height); 
    $image->save(DIR_IMAGE . $new_image); 
} else { 
    copy(DIR_IMAGE . $old_image, DIR_IMAGE . $new_image); 
} 

Je ne sais pas si vous connaissez avec php, mais ce code dit efficace:

Si l'image hauteur et largeur sont les mêmes que ce qui est demandé, puis copiez simplement l'original dans le cache et utilisez-le.

. Dans votre exemple, vous montrez une image 500px x 500px et le résultat d'un transcodage 1: 1. Ce n'est tout simplement pas possible, sauf si vous avez des extensions tierces modifiant les méthodes de base ici. (2) L'augmentation de la taille que vous voyez peut être le résultat de métadonnées du système d'exploitation ou d'un moteur jpg légèrement moins optimisé que ce que votre application graphique peut offrir. Cela pourrait aussi être dû au contenu de l'image. Dans tous les cas, comme votre exemple démontre c'est négligeable - peut-être autour de 1k. Dans la plupart des cas, le moteur d'image sera capable de réduire la taille (voir l'exemple ci-dessous), mais cela dépend en réalité de divers facteurs.

(3) Les différences de qualité que vous montrez ne seront jamais apparentes dans la plupart des cas. Vous avez présenté ce que je considère comme un cas extrême avec des textures de niveaux de gris délicates zoomées. Tout type d'encodage avec perte ou de transcodage (jpg dans ce cas) risque de perdre des détails comme ça. C'est la nature de la compression avec perte - vous jetez des données en échange d'une taille de fichier plus petite.

Dans l'exemple suivant, j'ai pris une image aléatoire à 335px x 285px et l'ai redimensionnée à 335px x 284px juste comme une démonstration. Pour toutes fins utiles, je ne vois aucune dégradation de la qualité ici et la taille de l'image est passée de 32k jusqu'à 22k - une taille beaucoup plus petite:

originale (335px x 285px, 32k):

http://zuma-design.com/shared/so/image-compare/kitten.jpg

transcodé par Opencart (335px x 284px, 22k):

http://zuma-design.com/shared/so/image-compare/kitten-335x284.jpg

Avec tout cela, si vous pensez toujours que la désactivation du cache d'image va profiter à votre site particulier, ce serait extrêmement facile. Regardez catalogue/modèle/outil/image.php et modifier la méthode resize() pour revenir tout simplement le même nom, il est passé:

public function resize($filename, $width, $height) { 
    if ($this->request->server['HTTPS']) { 
     return $this->config->get('config_ssl') . 'image/' . $filename; 
    } else { 
     return $this->config->get('config_url') . 'image/' . $filename; 
    } 
}