Existe-t-il un moyen simple d'afficher un bitmap couleur en niveaux de gris avec juste HTML/CSS
?
Il n'a pas besoin d'être compatible avec IE (et j'imagine que ce ne sera pas le cas) - si cela fonctionne dans FF3 et / ou Sf3, c'est assez bon pour moi.
Je sais que je peux le faire avec les deux SVG
et Canvas, mais cela semble être beaucoup de travail en ce moment.
Y a-t-il un moyen vraiment paresseux pour le faire?
Réponses:
La prise en charge des filtres CSS est arrivée dans Webkit. Nous avons donc maintenant une solution multi-navigateur.
Et Internet Explorer 10?
Vous pouvez utiliser un polyfill comme le gris .
la source
À la suite de la réponse de brillout.com , ainsi que la réponse de Roman Nurik , et se détendre un peu l'exigence du « non SVG », vous pouvez désaturer images dans Firefox en utilisant un seul fichier SVG et CSS certains.
Votre fichier SVG ressemblera à ceci:
Enregistrez-le en tant que resources.svg, il peut être réutilisé à partir de maintenant pour toute image que vous souhaitez modifier en niveaux de gris.
Dans votre CSS, vous référencez le filtre en utilisant le spécifique Firefox
filter
propriété :Ajoutez aussi les propriétés propriétaires de MS si vous en avez envie, appliquez cette classe à n'importe quelle image que vous souhaitez convertir en niveaux de gris (fonctionne dans Firefox> 3.5, IE8) .
edit : Voici un joli article de blog qui décrit l'utilisation de la nouvelle
filter
propriété CSS3 dans la réponse de SalmanPK de concert avec l'approche SVG décrite ici. En utilisant cette approche, vous vous retrouveriez avec quelque chose comme:Plus d'informations sur le support du navigateur ici .
la source
-webkit-filter: grayscale(100%);
puis ceci:-webkit-filter: grayscale(0);
pour le supprimer.Pour Firefox, vous n'avez pas besoin de créer un fichier filter.svg, vous pouvez utiliser le schéma d'URI de données .
Reprendre le code CSS de la première réponse donne:
Prenez soin de remplacer la chaîne "utf-8" par votre encodage de fichier.
Cette méthode devrait être plus rapide que l'autre car le navigateur n'aura pas besoin de faire une deuxième requête HTTP.
la source
Mise à jour: j'en ai fait un dépôt GitHub complet, y compris du polyfill JavaScript pour IE10 et IE11: https://github.com/karlhorky/gray
J'ai utilisé à l' origine la réponse de SalmanPK , mais ensuite créé la variante ci-dessous pour éliminer la demande HTTP supplémentaire requise pour le fichier SVG. Le SVG en ligne fonctionne dans les versions 10 et supérieures de Firefox, et les versions inférieures à 10 ne représentent même plus 1% du marché mondial des navigateurs.
Depuis, je garde la solution à jour sur ce billet de blog , ajoutant la prise en charge du fondu en couleur, la prise en charge d'IE 10/11 avec SVG et des niveaux de gris partiels dans la démo.
la source
Si vous êtes en mesure d'utiliser JavaScript, ce script peut être ce que vous recherchez. Cela fonctionne sur plusieurs navigateurs et fonctionne très bien pour moi jusqu'à présent. Vous ne pouvez pas l'utiliser avec des images chargées à partir d'un domaine différent.
http://james.padolsey.com/demos/grayscale/
la source
Je viens d'avoir le même problème aujourd'hui. J'ai d'abord utilisé la solution SalmanPK mais j'ai découvert que l'effet diffère entre FF et les autres navigateurs. C'est parce que la matrice de conversion ne fonctionne que sur la luminosité et non sur la luminosité comme les filtres dans Chrome / IE. À ma grande surprise, j'ai découvert qu'une solution alternative et plus simple en SVG fonctionne également dans FF4 + et produit de meilleurs résultats:
Avec CSS:
Une autre mise en garde est que IE10 ne prend plus en charge "filter: gray:" en mode conforme aux normes, donc a besoin d'un commutateur de mode de compatibilité dans les en-têtes pour fonctionner:
la source
filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'grayscale\'><feColorMatrix type=\'saturate\' values=\'0\'/></filter></svg>#grayscale");
Le moyen le plus simple d'obtenir exclusivement des niveaux de gris avec CSS est via la
filter
propriété.La propriété n'est toujours pas entièrement prise en charge et nécessite toujours la
-webkit-filter
propriété pour la prise en charge sur tous les navigateurs.la source
Il ne semble pas (encore) possible, même avec CSS3 ou propriétaire
-webkit-
ou-moz-
CSS.Cependant, j'ai trouvé ce post de juin dernier qui utilisait des filtres SVG sur HTML. Non disponible dans aucun navigateur actuel (la démo faisait allusion à une version WebKit personnalisée), mais très impressionnante comme preuve de concept.
la source
Pour les personnes qui posent des questions sur le support IE10 + ignoré dans d'autres réponses, consultez ce morceau de CSS:
Appliqué sur ce balisage:
Pour plus de démos, consultez la section Graphiques CSS3 de IE testdrive et cet ancien blog IE http://blogs.msdn.com/b/ie/archive/2011/10/14/svg-filter-effects-in-ie10.aspx
la source
Dans Internet Explorer, utilisez la propriété filter.
Dans webkit et Firefox, il n'y a actuellement aucun moyen de désatuarte une image uniquement avec CSS. vous devrez donc utiliser canvas ou SVG pour une solution côté client.
Mais je pense que l'utilisation de SVG est plus élégante. consultez mon article de blog pour la solution SVG qui fonctionne à la fois pour Firefox et webkit: http://webdev.brillout.com/2010/10/desaturate-image-without-javascript.html
Et à proprement parler puisque SVG est HTML, la solution est pure html + css :-)
la source
Une nouvelle façon de procéder est disponible depuis un certain temps sur les navigateurs modernes.
le mode background-blend vous permet d'obtenir des effets intéressants, dont l'un est la conversion en niveaux de gris
La luminosité de la valeur , réglée sur un fond blanc, le permet. (survoler pour le voir en gris)
La luminosité est prise de l'image, la couleur est prise de l'arrière-plan. Puisqu'il est toujours blanc, il n'y a pas de couleur.
Mais cela permet bien plus.
Vous pouvez animer le réglage de l'effet sur 3 calques. La première sera l'image et la seconde sera un dégradé blanc-noir. Si vous appliquez un mode de mélange multiplié à cela, vous obtiendrez un résultat blanc comme précédemment sur la partie blanche, mais l'image d'origine sur la partie noire (multiplier par blanc donne du blanc, multiplier par noir n'a aucun effet.)
Sur la partie blanche du dégradé, vous obtenez le même effet qu'auparavant. Sur la partie noire du dégradé, vous mélangez l'image sur elle-même et le résultat est l'image non modifiée.
Maintenant, tout ce qui est nécessaire est de déplacer le dégradé pour obtenir cet effet dynamique: (survoler pour le voir en couleur)
référence
matrice de compatibilité
la source
img
balise n'est pas utilisée pour l'imagebackground: url()
la source
Peut-être que cette façon vous aidera
w3schools.org
la source
Il est en fait plus facile de le faire avec IE si je me souviens bien d'avoir utilisé une propriété CSS propriétaire. Essayez ceci
FILTER: Gray
depuis http://www.ssi-developer.net/css/visual-filters.shtmlLa méthode d' Ax rend simplement l'image transparente et a un fond noir derrière. Je suis sûr que vous pourriez dire que c'est en niveaux de gris.
Bien que vous ne vouliez pas utiliser Javascript, je pense que vous devrez l'utiliser. Vous pouvez également utiliser un langage côté serveur pour le faire.
la source
filter: gray
est présent dans Internet Explorer depuis la version 4 . Ils ont pris beaucoup de merde pour leur produit - à juste titre! - mais ils étaient vraiment en avance sur leur temps avec ce genre de chosesSi vous souhaitez utiliser Javascript, vous pouvez utiliser un canevas pour convertir l'image en niveaux de gris. Depuis la prise en charge de Firefox et Safari
<canvas>
, cela devrait fonctionner.J'ai donc googlé "toile en niveaux de gris", et le premier résultat a été http://www.permadi.com/tutorial/jsCanvasGrayscale/index.html qui semble fonctionner.
la source
la prise en charge des filtres CSS natifs dans le webkit a été ajoutée à partir de la version actuelle 19.0.1084.46
donc -webkit-filter: les niveaux de gris (1) fonctionneront et ce qui est plus facile que l'approche SVG pour webkit ...
la source
Voici un mixin pour MOINS qui vous permettra de choisir n'importe quelle opacité. Remplissez vous-même les variables pour CSS simple à différents pourcentages.
Astuce ici , il utilise le type saturé pour la matrice, vous n'avez donc rien à faire pour changer le pourcentage.
Ensuite, utilisez-le:
la source
Vous n'avez pas besoin d'utiliser autant de préfixes pour une utilisation complète, car si vous choisissez le préfixe pour l'ancien firefox, vous n'avez pas besoin d'utiliser le préfixe pour le nouveau firefox.
Donc, pour une utilisation complète, utilisez suffisamment ce code:
la source
En complément des réponses des autres, il est possible de désaturer une image à mi-chemin sur FF sans les maux de tête de la matrice SVG :
Où
$v
est entre0
et1
. C'est équivalent àfilter:grayscale(50%);
.Exemple en direct:
Afficher l'extrait de code
Référence sur MDN
la source
Basé sur la réponse de robertc :
Pour obtenir une conversion correcte de l'image colorée en image en niveaux de gris au lieu d'utiliser une matrice comme celle-ci:
Vous devez utiliser une matrice de conversion comme celle-ci:
Cela devrait fonctionner correctement pour tous les types d'images basés sur le modèle RGBA (rouge-vert-bleu-alpha).
Pour plus d'informations sur la raison pour laquelle vous devriez utiliser la matrice, j'ai publié plus probablement que l'un des robertc vérifie les liens suivants:
la source
0.2126 0.7152 0.0722 0 0
semble être l'équivalent de<fecolormatrix type="saturate" values="0">
Une solution terrible mais réalisable: rendre l'image à l'aide d'un objet Flash, qui vous donne ensuite toutes les transformations possibles dans Flash.
Si vos utilisateurs utilisent des navigateurs à la pointe de la technologie et que Firefox 3.5 et Safari 4 le prennent en charge (je ne sais pas si c'est le cas / le feront), vous pouvez ajuster l' attribut CSS de profil de couleur de l'image, en le définissant sur un ICC en niveaux de gris Profil URL. Mais ça fait beaucoup de si!
la source
être une alternative pour les anciens navigateurs pourrait être d'utiliser un masque produit par des pseudo-éléments ou des balises en ligne.
Le positionnement absolu en survolant une img (ou une zone de texte qui ne nécessite ni clic ni sélection) peut imiter étroitement les effets de l'échelle des couleurs, via rgba () ou translucide png .
Il ne donnera pas une seule échelle de couleurs, mais nuancera les couleurs hors de portée.
test sur stylo code avec 10 couleurs différentes via pseudo-élément, le dernier est gris. http://codepen.io/gcyrillus/pen/nqpDd (recharger pour passer à une autre image)
la source
Vous pouvez utiliser l'une des fonctions de jFunc - utilisez la fonction "jFunc_CanvasFilterGrayscale" http://jfunc.com/jFunc-functions.aspx
la source
Essayez ce plugin jquery. Bien que ce ne soit pas une solution HTML et CSS pure, c'est un moyen paresseux de réaliser ce que vous voulez. Vous pouvez personnaliser votre échelle de gris en fonction de votre utilisation. Utilisez-le comme suit:
Il y a une démo interactive . Vous pouvez jouer avec.
Consultez la documentation sur l'utilisation, c'est assez simple. docs
la source
Pour les niveaux de gris en pourcentage dans Firefox, utilisez plutôt un filtre saturé : (recherchez «saturé»)
la source
Si vous, ou quelqu'un d'autre confronté à un problème similaire à l'avenir, êtes ouvert à PHP. (Je sais que vous avez dit HTML / CSS, mais vous utilisez peut-être déjà PHP dans le backend) Voici une solution PHP:
Je l'ai obtenu de la bibliothèque PHP GD et j'ai ajouté une variable pour automatiser le processus ...
la source