Existe uma maneira simples de exibir um bitmap colorido em escala de cinza com apenas HTML/CSS
?
Não precisa ser compatível com o IE (e imagino que não será) - se funcionar em FF3 e / ou Sf3, isso é bom o suficiente para mim.
Eu sei que posso fazer isso com o SVG
Canvas e com o Canvas, mas isso parece muito trabalho agora.
Existe uma maneira verdadeiramente preguiçosa de fazer isso?
Respostas:
O suporte para filtros CSS chegou ao Webkit. Portanto, agora temos uma solução para vários navegadores.
E o Internet Explorer 10?
Você pode usar um polyfill como cinza .
fonte
Seguindo a resposta de brillout.com , e também a resposta de Roman Nurik , e relaxando um pouco o requisito 'no SVG', você pode dessaturar imagens no Firefox usando apenas um único arquivo SVG e algum CSS.
Seu arquivo SVG ficará assim:
Salve isso como resources.svg, ele pode ser reutilizado a partir de agora para qualquer imagem que você queira alterar para escala de cinza.
No seu CSS, você faz referência ao filtro usando a
filter
propriedade específica do Firefox :Adicione os proprietários da MS também, se quiser, aplique essa classe a qualquer imagem que você deseja converter em escala de cinza (funciona no Firefox> 3.5, IE8) .
edit : Aqui está uma boa postagem no blog que descreve o uso da nova
filter
propriedade CSS3 na resposta do SalmanPK em conjunto com a abordagem SVG descrita aqui. Usando essa abordagem, você acabaria com algo como:Mais informações de suporte ao navegador aqui .
fonte
-webkit-filter: grayscale(100%);
então isto:-webkit-filter: grayscale(0);
para removê-lo.Para o Firefox, você não precisa criar um arquivo filter.svg, pode usar o esquema de URI de dados .
Adotar o código css da primeira resposta fornece:
Tome cuidado para substituir a string "utf-8" pela codificação do arquivo.
Este método deve ser mais rápido que o outro, porque o navegador não precisará fazer uma segunda solicitação HTTP.
fonte
Atualização: transformei isso em um repositório completo do GitHub, incluindo o polyfill JavaScript para IE10 e IE11: https://github.com/karlhorky/gray
Originalmente, usei a resposta do SalmanPK , mas criei a variação abaixo para eliminar a solicitação HTTP extra necessária para o arquivo SVG. O SVG embutido funciona no Firefox versões 10 e posteriores, e versões inferiores a 10 não representam mais 1% do mercado global de navegadores.
Desde então, tenho mantido a solução atualizada neste post do blog , adicionando suporte para o desbotamento das cores, suporte para o IE 10/11 com SVG e escala de cinza parcial na demonstração.
fonte
Se você é capaz de usar JavaScript, esse script pode ser o que você está procurando. Ele funciona em vários navegadores e está funcionando bem para mim até agora. Você não pode usá-lo com imagens carregadas de um domínio diferente.
http://james.padolsey.com/demos/grayscale/
fonte
Só tenho o mesmo problema hoje. Inicialmente, usei a solução SalmanPK, mas descobri que o efeito difere entre o FF e outros navegadores. Isso ocorre porque a matriz de conversão funciona apenas com leveza e não com luminosidade, como filtros no Chrome / IE. Para minha surpresa, descobri que uma solução alternativa e mais simples no SVG também funciona no FF4 + e produz melhores resultados:
Com css:
Mais uma ressalva é que o IE10 não suporta mais "filter: grey:" no modo compatível com os padrões, portanto, é necessário alternar o modo de compatibilidade nos cabeçalhos para funcionar:
fonte
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");
A maneira mais simples de obter escala de cinza com CSS exclusivamente é através da
filter
propriedadeA propriedade ainda não é totalmente suportada e ainda requer a
-webkit-filter
propriedade para suporte em todos os navegadores.fonte
Parece que não é possível (ainda), mesmo com CSS3 ou propriedades proprietárias
-webkit-
ou-moz-
CSS.No entanto, encontrei este post de junho passado que usava filtros SVG em HTML. Não disponível em nenhum navegador atual (a demonstração sugeria uma compilação personalizada do WebKit), mas muito impressionante como prova de conceito.
fonte
Para as pessoas que estão perguntando sobre o suporte ignorado do IE10 + em outras respostas, confira este trecho de CSS:
Aplicado nesta marcação:
Para mais demonstrações, consulte a seção de gráficos CSS3 do IE testdrive e este blog antigo do IE http://blogs.msdn.com/b/ie/archive/2011/10/14/svg-filter-effects-in-ie10.aspx
fonte
No Internet Explorer, use a propriedade filter.
No webkit e no Firefox, atualmente não há como desatuar uma imagem apenas com CSS. portanto, você precisará usar canvas ou SVG para uma solução do lado do cliente.
Mas acho que usar SVG é mais elegante. confira minha postagem no blog para a solução SVG que funciona tanto para Firefox quanto para webkit: http://webdev.brillout.com/2010/10/desaturate-image-without-javascript.html
E estritamente falando, já que SVG é HTML, a solução é pura html + css :-)
fonte
Uma nova maneira de fazer isso está disponível há algum tempo nos navegadores modernos.
O modo de mesclagem em segundo plano permite obter alguns efeitos interessantes, e um deles é a conversão em escala de cinza
A luminosidade do valor , definida em um fundo branco, permite isso. (passe o mouse para vê-lo em cinza)
A luminosidade é tirada da imagem, a cor é tirada do fundo. Como é sempre branco, não há cores.
Mas permite muito mais.
Você pode animar o efeito configurando 3 camadas. O primeiro será a imagem e o segundo será um gradiente branco-preto. Se você aplicar um modo de mesclagem múltipla, obterá um resultado branco como antes na parte branca, mas a imagem original na parte preta (multiplicar por branco dá branco, multiplicar por preto não tem efeito).
Na parte branca do gradiente, você obtém o mesmo efeito de antes. Na parte preta do gradiente, você está mesclando a imagem sobre si mesma, e o resultado é a imagem não modificada.
Agora, basta mover o gradiente para obter esse efeito dinâmico: (passe o mouse para vê-lo em cores)
referência
matriz de compatibilidade
fonte
img
tag é usada para a imagem nãobackground: url()
fonte
Talvez dessa maneira te ajude
w3schools.org
fonte
Na verdade, é mais fácil fazê-lo com o IE se me lembro corretamente de usar uma propriedade CSS proprietária. Tente isso
FILTER: Gray
em http://www.ssi-developer.net/css/visual-filters.shtmlO método de Ax simplesmente torna a imagem transparente e tem um fundo preto por trás. Tenho certeza que você poderia argumentar que isso é em escala de cinza.
Embora você não queira usar o Javascript, acho que precisará usá-lo. Você também pode usar um idioma do lado do servidor para fazer isso.
fonte
filter: gray
está presente no Internet Explorer desde a versão 4 . Eles exigiram muita porcaria do produto - com razão! - mas eles foram realmente à frente de seu tempo com essas coisasSe você deseja usar Javascript, pode usar uma tela para converter a imagem em escala de cinza. Desde o suporte ao Firefox e Safari
<canvas>
, ele deve funcionar.Então, pesquisei em "escala de cinza de tela" e o primeiro resultado foi http://www.permadi.com/tutorial/jsCanvasGrayscale/index.html, que parece funcionar.
fonte
foi adicionado suporte para filtros CSS nativos no webkit a partir da versão atual 19.0.1084.46
então -webkit-filter: grayscale (1) funcionará e é mais fácil do que a abordagem SVG para webkit ...
fonte
Aqui está um mixin para MENOS que permitirá que você escolha qualquer opacidade. Preencha você mesmo as variáveis para obter CSS simples em diferentes porcentagens.
Dica interessante aqui , ele usa o tipo saturado para a matriz, para que você não precise fazer nada sofisticado para alterar a porcentagem.
Então use-o:
fonte
Você não precisa usar tantos prefixos para uso total, porque se você escolher o prefixo para o Firefox antigo, não precisará usar o prefixo para o novo Firefox.
Portanto, para uso total, basta usar este código:
fonte
Como complemento às respostas de outros, é possível dessaturar uma imagem no meio do caminho no FF sem as dores de cabeça da matriz do SVG :
Onde
$v
está entre0
e1
. É equivalente afilter:grayscale(50%);
.Exemplo ao vivo:
Mostrar snippet de código
Referência no MDN
fonte
Com base na resposta de robertc :
Para obter uma conversão adequada da imagem colorida para a escala de cinza, em vez de usar uma matriz como esta:
Você deve usar a matriz de conversão como esta:
Isso deve funcionar bem para todos os tipos de imagens baseadas no modelo RGBA (vermelho-verde-azul-alfa).
Para obter mais informações sobre por que você deve usar a matriz, postei mais provavelmente que o robertc verifique os seguintes links:
fonte
0.2126 0.7152 0.0722 0 0
parece ser o equivalente a<fecolormatrix type="saturate" values="0">
Uma solução terrível, mas viável: renderize a imagem usando um objeto Flash, que fornece todas as transformações possíveis no Flash.
Se seus usuários estiverem usando navegadores de última geração e se o Firefox 3.5 e o Safari 4 o suportarem (não sei / o que faz / o fará), você pode ajustar o atributo CSS -profile da imagem, configurando-o para um ICC em escala de cinza URL do perfil. Mas isso é muito se!
fonte
ser uma alternativa para o navegador mais velho poderia ser a máscara de uso produzido por pseudo-elementos ou tags inline.
O posicionamento absoluto ao passar o mouse sobre um img (ou área de texto que não precisa de clique nem seleção) pode imitar de perto os efeitos da escala de cores, via rgba () ou png translúcido .
Não fornecerá uma única escala de cores, mas matizará as cores fora do intervalo.
teste em caneta de código com 10 cores diferentes via pseudo-elemento; por último, cinza. http://codepen.io/gcyrillus/pen/nqpDd (atualize para mudar para outra imagem)
fonte
Você pode usar uma das funções do jFunc - use a função "jFunc_CanvasFilterGrayscale" http://jfunc.com/jFunc-functions.aspx
fonte
Experimente este plugin jquery. Embora não seja uma solução HTML e CSS pura, é uma maneira lenta de conseguir o que deseja. Você pode personalizar sua escala de cinza para melhor se adequar ao seu uso. Use-o da seguinte forma:
Há uma demonstração interativa . Você pode brincar com isso.
Confira a documentação sobre o uso, é bastante simples. docs
fonte
Para escala de cinza como porcentagem no Firefox, use o filtro saturar : (pesquise 'saturar')
fonte
Se você ou outra pessoa que enfrenta um problema semelhante no futuro estiver aberto ao PHP. (Eu sei que você disse HTML / CSS, mas talvez você já esteja usando PHP no back-end) Aqui está uma solução PHP:
Peguei na biblioteca PHP GD e adicionei algumas variáveis para automatizar o processo ...
fonte