Categorias
Casos Conversão GIMP GIMP Linux procedimentos Scheme suporte webmaster

Redução de tamanho de arquivos de imagem

Problema:

Imagens estão ocupando muito espaço na hospedagem do site. Reduzir a qualidade das imagens .

O tamanho das imagens também podem vir

  1. do tamanho das própria imagem
  2. Resolução da imagem.

 

Proposta:

Usar o Gimp em seu processamento de lote para ajustar a qualidade das imagens (50% no caso das imagens JPEG) o mesmo procedimento para as fotos.

Claro que se as imagens já estiverem com esta qualidade, ou menor, não haverá ganho.

Um pouco de Código:


 (define (batch-half-quality-jpeg-file pattern
                                      radius
                                      amount
                                      threshold)
    (let* ((filelist (cadr (file-glob pattern 1))))
       (while (not (null? filelist))
         (let* ((filename (car filelist))
            (image (car (gimp-file-load RUN-NONINTERACTIVE
                                        filename filename)))
            (drawable (car (gimp-image-get-active-layer image))))
         (file-jpeg-save RUN-NONINTERACTIVE
                         image drawable filename filename
                         0.50 0 1 1 "GIMP" 0 1 0 0)
                  ; 0.50 quality (float 0 <= x <= 1)
                  ; 0 smoothing factor (0 <= x <= 1)
                  ; 1 optimization of entropy encoding parameter (0/1)
                  ; 1 enable progressive jpeg image loading (0/1)
                  ; "xxxx" image comment
                  ; 0 subsampling option number
                  ; 1 force creation of a baseline JPEG
                  ; 0 frequency of restart markers
                  ; in rows, 0 = no restart markers
                  ; 0 DCT algoritm to use
         (gimp-image-delete image))
         (set! filelist (cdr filelist)))))

Este código foi colocado em um arquivo batch-half-quality-jpeg-file.scm na pasta ~/.gimp-2.8/scritps

Ooops. Parece que restos do código antigo ficaram neste código. Recomenda-se cautela.

O script foi executado de um terminal

~$ gimp -i -b '(batch-half-quality-jpeg-file "./fotos/lote01-50/*.JPG" 5.0 0.5 0)' -b '(gimp-quit 0)'

Note que os arquivos originais são sobreescritos sem maiores questionamentos.

O processamento resulta em algumas mensagens de alerta como

(gimp:15907): GLib-GObject-WARNING **: g_object_set_valist: object class 'GeglConfig' has no property named 'cache-size'
...
(gimp:15907): GEGL-gegl-operation.c-WARNING **: Cannot change name of operation class 0x123A330 from "gimp:point-layer-mode" to "gimp:anti-erase-mode"
While parsing XMP metadata:
Erro: não foi encontrado nenhum pacote XMP
....
batch command executed successfully

Porem atinge os nossos objetivos de diminuir o tamanho dos arquivos de image.

Como esta solução foi usada em um Ubuntu 15.10 e GIMP 2.8, algumas adaptações podem ser necessárias para o seu ambiente.

Referencias:

  1. GNU Image Manipulation Program – Documentação bem completa do Gimp.
  2. GIMP Batch Mode – um tutorial para começar a entender o processamento em lote usando o Gimp.
  3. Preparing your Images for the Web – Orientações de preparação de imagens para uso na Web.
  4. Your First Script-Fu Script
  5. Automatic Creation of XCF from JPG – Será que dá para salva de volta como JPEG, mas com novos parametros de qualidade?
  6. Writing GIMP Scripts and Plug-Ins – o básico sobre escrever scripts e plugins para o Gimp.
  7. Notes on GIMP Scripting
  8. GIMP: Re-uniting Save and Export
  9. Krita – Alternativa ao Gimp como ferramenta de desenho.
  10. Some GIMP Scripts-Fu (and Related ImageMagick Notes)
Categorias
HTML HTML5 Internet Explorer webdesign webmaster

HTML5 – notas de uso….

No inferno, Abrace o Diabo!

O MAC me falou sobre aprender com os tutorials. Resolvi dar uma olhada como estão os tutorials em especial nesta área de HTML5.

Referencias:

Categorias
Casos Python

Ordenar tabela com PinYin em ordem natural.

PythonO Chinês é uma lingua muito peculiar. Uma língua monosilábica, tonal (alteração de tons na pronúnica da silaba diferencia o signicado das palavras). Para representar os sons das palavras chinesas padronizou-se o uso do PinYin (transliteração oficial) representando os 4 tons através de sinais diacriticos sobre as vogais. Veja um pequeno exemplo :

A mesma silaba "Ma" apresentada nos diversos tons, apresenta significados bem distintos.

Neste momento, eu me defronto com o problema de ordenar um glossário (planilha) de tres colunas : Ideograma, PinYin, e significado. Para facilitar aa consulta de um tal Glossário, digamos com mil expressões, gostaríamos de ordenar em ordem alfabética da coluna PinYin. Está é uma ordem natural uma vez que as letras A com ou sem os sinais diacriticos estão na ordem numérica convencionada para os tons. Mas, quando ordenamos pela coluna PinYin (B), numa planilha (Calc do LibreOffice, ou Excel do Office Microsoft) obtemos :

Isso porque as vogais com diacriticos foram dispostos na tabela de caracteres em espaços disponíveis não de considerando este nosso possivel interesse.

Esperar que a tabela de condificação dos caracteres diacríticos seja revista para contemplar a ordem natural das palavras chinesas parece estar fora de questão. Vamos a uma solução local e particular.

Criaremos uma coluna adicional, somente para a classificação em ordem natural das palavras chinesas aproveitando a estrutura atual de condificação dos caracteres com diacriticos.

Usaremos o recurso string.translate(str.maketrans(raw, coded)) do Python convertendo as vogar "āáǎàaēéěèeīíǐìiōóǒòoǖǘǚǜüūúǔùu" para "aáàǎāeéèěēiíìǐīoóòǒōuúùǔüǘǜǚǖū" obtendo a coluna auxiliar para a classificação.
 

Como a ordenação do pinyin considera cada um dos tons de cada vogal diferentemente na ordenação, tivemos que subtituir cada vogal para a configuração vn onde v é a vogal sem o diacritico seguido pelo n do tom na sequencia desejada. Por exemplo, considerando o tom neutro como 5 para ficar depois dos 4 outros tons na ordenação. Alem disso, tomamos o cuidado de ordenar corretamente o u com o ü! Usamos a metodo s.replace dos strings do python para fazer as substuições.

Dado uma lista de expressões contendo palavras em PinYin tentarei ordenar em sua ordem natural. Esclarecendo, a ordem dos caracteres diacriticos não é natural.

Referências:

  • http://gomputor.wordpress.com/2008/09/27/search-replace-multiple-words-or-characters-with-python/ – aqui uma forma de substituição de caracteres.
  • str.translate(table[, deletechars]) – parece ser mais adequado para o nosso caso.
Categorias
OpenBiblio Programação

OpenBiblio – +1 Relatório

OpenBiblio - a library system that's free
um sistema de biblioteca que é livre

Vou anotar aqui as minhas observações sobre a criação de um relatório adicional para a nossa instalação do OpenBiblio (http://cedom.net/biblioteca/).

Sentimos a falta do histórico de um exemplar, para saber por onde ele andou, quem o retirou. Estas são as notas sobre o processo de criação de um tal relatório para a nossa biblioteca. O detalhamento destas notas é condicionado ao processo criativo.

Nada se cria, tudo se copia….

Meu modo básico de criar um novo relatório, eu copio um relatório existente (~/reports/defs/*.rpt) com um novo nome. Se possível, escolho um relatório parecido com o que quero criar….

Identificação

Cada relatório deve ter o seu nome, e cada nome somente deve ser usado para um relatório…. assim,

.title HistoricoCirculacao

alterei a primeira linha do meu novo relatório para ter uma palavra chave para o nome do meu relatório. Sim, esta deve ser somente uma palavra chave, que será o nome do relatório, se quiser que ele seja decodificada em sua lingua local, inclua uma linha de decodificação no arquivo ~/locale/pt/reports.php com o formato

$trans["HistoricoCirculacao"]  = "\$text = 'Histórico de Circulação';";

ainda no tema Identificação cabe definir a linha

.category Circulation

para indicar em que bloco de relatórios, este novo item deve entrar.

… encontrei um relatório muito parecido

Encontrei um relatório muito parecido com o que eu precisava em Reports, assim esta saga de escrever relatórios para a nossa biblioteca ficou para uma próxima oportunidade.

… Relatórios.

  • Acompanhamento de Catalogação ganhou uma nova versão agora com a possibilidade de demarcar a data de inicio e data de fim do periodo de analise. Status : Instalado em testes.
  • Titulos – uma lista de titulos, com a contagem de exemplares. Status: Instalado em testes.
  • Leitores – especialmente preparado para crítica do cadastro de leitores com data de atualização, nome e sobrenome, endereço, telefones, grupo, e contagens. Status: A Desenvolver.

Perguntas

  • Comentários – como eu incluo comentários em meu relatório? afinal quero deixar claro o que estou fazendo para quem for ler este programa.

Referências

  • Reports – uma lista de relatórios prontos que podem ser úteis.
  • WritingReports – a documentação sobre o módulo de relatórios do OpenBiblio na sua versão 0.6x.
  • RPTSyntax – a Sintaxe dos arquivos de configuração de relatórios. Pode não ser realmente completo, mas dá uma boa idéia do que pode ser feito e como fazê-lo.
  • OpenBiblio Customization – encontrei aqui bons recursos adicionais para a nossa instalação do OpenBiblio. Relatórios adicionais com contagem foi bem proveitoso.
  • MySQL Outer Join Tips – algumas dicas de outer join do mysql que ajudam na construação de relatorios.
  • Sintaxe Join – em último caso, sempre recorrer ao manual do MySQL.
Categorias
Programação Python

Python 3.2….

Python3.2
Python3.2

Isso pode ser “colocar o carro á frente dos bois”, mas como cai neste problema, vou procurar registrar aqui as minhas notas para futuras referencias.

O Robot de catalogação de livros em nossa biblioteca foi desenvolvido pelo DN para python3, e funciona bem no Python3.1

$ python3.1

Python 3.1.3 (r313:86834, Mar 25 2011, 20:54:26)

[GCC 4.5.2] on linux2

Type “help”, “copyright”, “credits” or “license” for more information.

>>>

mas, para o Python 3.2 ele não funciona

$ python3.2

Python 3.2 (r32:88445, Mar 25 2011, 19:56:22)

[GCC 4.5.2] on linux2

Type “help”, “copyright”, “credits” or “license” for more information.

>>>

Dando um erro :

$ python3.2 form20d.pyw

Exception in Tkinter callback

Traceback (most recent call last):

File “/usr/lib/python3.2/tkinter/__init__.py”, line 1402, in __call__

return self.func(*args)

File “form20d.pyw”, line 420, in salvarEdicao

cedom.salvarEdicao(self)

File “/home/omy/cedom/robot/robot20d/cedom.py”, line 424, in salvarEdicao

bibid = re.findall(r’new_form.php\?bibid=(\d+)&reset=’, result)[0]

IndexError: list index out of range

A solução óbvia, continuar usando o Python 3.1, funciona! Mas… “no inferno, abrace o diabo!”
O problema está nas diferenciações do tipo str do tipo byte. Na versão 3.2, as funções da urllib passaram a exigir parametros byte, não aceitando mais o formato str.