Não
podia deixar de existir uma versão for windows do Graphos
III, é claro, mas com uma abordagem totalmente diferente
da que foi adotada para todas as outras versões. Manteremos a didática,
o propósito educacional e a programação aberta, como foi planejado
para o primeiro Graphos, ainda no tempo do TRS
80.
Já
vai longe o tempo no qual bastava um editor gráfico bom para resolver
qualquer trabalho artístico feito no computador. Em nossos dias,
um profissional do ramo deve dispor de um bom conjunto de ferramentas
de edição. É natural, pois nenhum software consegue prover o usuário
de todas as necessidades. Se assim fosse, o programa certamente
seria uma monstruosidade em termos de megabytes. Outra razão para
o uso de vários softwares é que cada um é sempre muito bom em determinados
aspectos e fraco em outros. Desta forma, o uso de diversos sistemas
nos dá uma cobertura ampla de todas as necessidades.
Apesar
da diversidade de programas, no dia a dia não é raro nos depararmos
com aquele recurso especial que nenhum programa tem. As vezes é
uma coisa tão simples que a indústria do software se esquece de
implementá-lo. Outras vezes trata-se de um recurso tão específico
que nem vale a pena adicioná-lo ao pacotão comercial.
Quer
um exemplo? Numa redução de cores, todos os filtros atuais tomam
como base cada ocorrência de cor. Eles não fazem antes uma avaliação
de qualidade. Cores com valores RGB próximos (geralmente com um
ou dois pontos de distinção entre os componentes) poderiam ser todas
convertidas em uma única cor. Nossos olhos e nossos monitores não
notarão a diferença. Faça um teste: veja se consegue distinguir
a diferença entre as cores abaixo. Aqui a precisão do computador
pode gerar uma redução de baixa qualidade, gerando dithering nas
imagens quando bastava uma acomodação nos tons.

Outro
exemplo? A grande maioria dos editores apresentam falhas no trabalho
de edição em modo ampliado. Editar uma imagem em modo zoom pode
se tornar cansativo não só em decorrência de uma ferramenta imprópria,
quanto pela própria característica do software de atuar indiscriminadamente
sobre toda a imagem.
Boa
parte dos programas atuais permite o recurso dos acréscimos especiais,
via plugins. Sem dúvida uma boa solução, mas que padece de um problema
grave: os plugins só servem para os programas para os quais foram
escritos. Existe um plugin com o recurso que preciso, mas ele foi
escrito para o editor X. Como não uso o editor X, não posso usar
o tal recurso.
O
que proponho nesta versão do Graphos III é simplesmente criar um
complemento para nossos editores gráficos prediletos. Ele não será
um programa de A a Z da edição gráfica. Será um recurso adicional,
que poderá ser implementado pelo usuário como uma função externa.
Para quem gosta de programar em Delphi, será uma porta aberta para
criar suas próprias funções especiais.
Nesta
primeira parte irei apresentar a interface de acesso às imagens
e a metodologia de trabalho. Na próximas matérias mostrarei as demais
partes de programação e as implementações que forem sendo feitas
ao sistema principal.
O
ponto principal aqui é usar o Graphos de dentro de um outro editor
gráfico. No Windows isto não é problema, pois além da multitarefa,
temos o recurso do clipboard. Estando no seu editor gráfico predileto,
basta colocar a imagem no clipboard e entrar no Graphos. Ao terminar
uma operação, colocamos novamente a imagem no clipboard e retornamos
ao nosso editor predileto. Nada de misterioso, fantástico, inusitado
ou sobrenatural. Com a qualidade dos programas que dispomos hoje,
os bons resultados são dependentes da capacidade e da criatividade
de uso dessas ferramentas e não da gama de recursos que elas disponibilizam.
Voltando
ao nosso caso específico, o primeiro passo é aprender (se ainda
não sabe) como recuperar uma imagem do clipboard do Windows e como
recolocá-la lá, para uso posterior.
O
clipboard é um objeto que precisa ser declarado na seção uses
do formulário. Do modo como estamos montando o Graphos, basta criar
uma seção uses logo após a declaração implementation:
implementation
{$R *.DFM}
uses
Clipbrd;
var
Buff: TBitmap;
Px,Py,Tx,Ty: integer;
O conjunto
de variáveis globais definido aqui serve para indicar (Px e Py)
a posição corrente do cursor do mouse, dentro da imagem; a largura
(Tx) e altura (Ty) da imagem e o buffer na memória onde estarão
os pixels. Usarei dois sistemas: um TBitmap em memória para obter
maior velocidade de processamento no acesso à imagem e um objeto
TImagem, para mostrar o conteúdo do TBitmap para o usuário.
A partir
deste ponto podemos usar o recurso de trocar imagens com qualquer
editor gráfico. Alguns dispõem de um sistema de clipboard autônomo,
então será necessário ajustá-lo para usar o clipboard do Windows.
Outra coisa a ser lembrada neste ponto é que, para uma melhor performance
do sistema, é aconselhável trabalhar sempre com imagens em true-color,
ou seja, com formato de 16 milhões de cores.
Apesar
de não haver restrições quanto ao tamanho da imagem manipulada,
é sempre mais prático trabalhar apenas com as partes que serão diretamente
afetadas pela edição. Para isso as ferramentas de cut e paste dos
editores são mais que úteis - são imprescindíveis.
{---
Capturando uma tela do clipboard ---}
procedure TForm1.TpasteClick(Sender:
TObject);
begin
if Clipboard.HasFormat(CF_BITMAP)
then begin
Buff.Assign(Clipboard);
Tela.Width:= Buff.Width;
Tela.Height:= Buff.Height;
Tx:= Buff.Width; Ty:= Buff.Height;
Buff.SaveToFile('grp3tmp.bmp');
Tela.Picture.LoadFromFile('grp3tmp.bmp');
end else begin
Tela.Width:= 0; Tela.Height:= 0;
end;
end;
Esta
procedure foi colocada num TSpeedButtom para facilitar
o trabalho de paste. A imagem deverá ser mostrada, no final, numa
TImage, que chamaremos de Tela.

A
propriedade HasFormat nos informa se o conteúdo do clipboard está
no padrão Bitmap ou não. Os principais valores presentes em HasFormat
podem ser:
CF_TEXT
- texto onde cada linha termina com um grupo de códigos CR-LF (#13
e #10). Um caracter nulo (0) indica o final do texto;
CF_BITMAP
- uma imagem no padrão bitmap do Windows;
CF_METAFILEPICT
- um arquivo do tipo metafile do Windows;
CF_PICTURE
- um objeto do tipo TPicture;
Note
que, antes de passar a imagem para a TImage "Tela", ela foi gravada
num arquivo chamado "gr3tmp.bmp". Ele será nosso arquivo temporário
de undo e serviu, na procedure que captura a imagem do clipboard,
para que a TImage "Tela" fosse adequadamente parametrizada para
receber a imagem.
O
caminho inverso é feito da seguinte forma:
procedure
TForm1.TCutClick(Sender: TObject);
begin
Clipboard.Assign(Tela.Picture);
end;
Dois
botões controlam o copy/paste do sistema e, para facilitar, não
iremos usar o sistema de menus. As implementações são feitas a partir
de novos botões colocados na barra de comandos superior. Como exemplo,
vamos implementar uma função que transforma as cores claras em um
tom de vermelho. Veja como isso é feito:
procedure
TForm1.SpeedButton1Click(Sender: TObject);
var
Tmx,Tmy:
integer;
begin
Buff.SaveToFile('grp3tmp.bmp');
for Tmy:= 0 to
Ty do begin
for
Tmx:= 0 to Tx do
begin
if Buff.Canvas.Pixels[Tmx,Tmy]
> $F0F0F0 then
Buff.Canvas.Pixels[Tmx,Tmy]:=
clRed;
end;
end;
Tela.Canvas.Draw(0,0,Buff);
end;
A
manipulação é feita diretamente sobre o Buff (TBitmap), que é salvo
antes no arquivo temporário. Sempre que acionamos uma função gravamos
o buffer de imagem para funcionar como undo.
Os
dois loopings se encarregam de checar se cada pixel está dentro
da faixa que iremos modificar. Esse procedimento pode ser usado
para qualquer tipo de filtro ou função que desejarmos implementar
mais à frente.
É
isso aí. As bases para o nosso sistema já estão lançadas. Agora
é com você. Aqui daremos algumas funções e implementações especiais.
Fique atento para não perder nada.
 |
Download
exclusivo...
Clique no link para fazer o
download dos arquivos. Se ainda não é assinante,
clique aqui e saiba como
assinar.
|
A
primeira parte do G3 4 win |
|
|