Flex SDK 3.2, Flash Player 10.0, AMFPHP 1.9, PHP 5, Firebird 2.1 e/ou
Oracle 10g standard.
Eu estou desenvolvendo uma aplicação para o cadastramento e confecção
de crachás (a impressão está sendo via PDF gerado pelo PHP).
Como um crachá precisa de uma foto, inicialmente fiz a captura
diretamente da WebCam para a tela (código abaixo)
// componente herdado de Panel (responsável por ver a imagem em
movimento da câmera)
var videoHolder:UIComponent = new UIComponent();
var camera:Camera = Camera.getCamera();
camera.setMode(640,480,15,true);
video = new Video(camera.width, camera.height);
video.attachCamera(camera);
videoHolder.addChild(video);
addChild(videoHolder);
videoHolder.y =10;
// código do botão na tela responsável por "bater a foto"
var snapshotHolder:UIComponent = new UIComponent();
var snapshot:BitmapData = new BitmapData(640, 480, true);
snapshot.draw(pnlWebcam.video);
Pronto está lá... tenho um Bitmap que posso cortar, redimensionar,
editar converter para JPEG, e gravar no banco.
Porém (e sempre tem um porém) surgiu a necessidade de capturar as
fotos já batidas numa Máquina Fotográfica.
OK.. fiz uma pesquisa e "copiei" o código abaixo (que só funciona no
Flash Player 10):
public function loadFromDisk():void {
fileRef = new FileReference();
var fileFilter:FileFilter = new FileFilter('Image', '*.jpg');
fileRef.addEventListener(Event.SELECT, selectHandler);
fileRef.addEventListener(Event.COMPLETE, completeHandler);
fileRef.browse([fileFilter]);
}
private function selectHandler(event:Event):void {
fileRef.removeEventListener(Event.SELECT, selectHandler);
fileRef.load();
}
private function completeHandler(event:Event):void {
var img: Image = new Image();
img.autoLoad = true;
img.load(fileRef.data);
}
E aqui eu tenho um problema... não consigo atribuir (via clone, draw
ou addChild) o conteúdo carregado para um BitmapData, e também não
consigo saber o tamanho da imagem carregada para "calcular" o
redimensionamento da foto.
Sendo assim, gostaria de algumas sugestões e dicas para contornar esta
limitação, permitindo que eu use a mesma rotina que trata um
BitmapData independente de sua origem.
Sem mais,
Eduardo Jedliczka
Apucarana - Pr
usa o ImageSnapshot
Tem um exemplo aqui.
http://blog.mxml.com.br/adobe-flex-com-relatorio-em-pdf
*Eduardo Kraus*
Desenvolvedor
eduardokraus@gmail.com
http://blog.mxml.com.br
http://twitter.com/EduardoKraus
[As partes desta mensagem que não continham texto foram removidas]
Continue usando a BitmapData para renderizar a foto, com base no bytes
carregados.
E daí, para "cortar" a fot, vc pode usar esses componentes/idéias de como
realizar um "crop"
http://www.flexer.info/2008/10/16/how-to-crop-and-resize-an-image-used-as-background-for-canvas/
http://blog.mediablur.com/2008/02/20/flex-image-cropping-component/
Já fiz uma aplicação "fotográfica" onde eu utilizo esse componente do
segundo link, ele possui alguns "bugs", mas nada dificil de arrumar.
--
Mario Junior
Enterprise Java / Flex Architectures
Adobe Certified Expert Flex 3 with AIR
Sofshore Informática
http://www.sofshore.com.br
+55 (48) 3337 2003
Rua Pastor Willian Richard Schisler Filho 452 sl 102, 88034-100 Itacorubi
Florianopolis SC Brasil
[As partes desta mensagem que não continham texto foram removidas]
Mário, obrigado pelas informações... era exatamente o que eu estava
pensando em fazer, porém, ainda continuo com o problema para carregar
o conteúdo do Image num BitmapData...
por hora, obrigado.
Eduardo
ao tentar usar o ImageSnapshot, dá um erro de runtime (não consigo
debugar uma aplicação no Flash 10) e sai da rotina!
coloquei um label (nome lbl) e alterei o meu código para :
private function completeHandler(event:Event):void {
var img: Image = new Image();
img.autoLoad = true;
img.load(fileRef.data);
pnlSnapshot.addChild(img);
pnlSnapshot.visible = true;
lbl.text = 'antes';
var iBmpData:BitmapData = ImageSnapshot.captureBitmapData(img);
lbl.text = 'depois';
}
e ao carregar a imagem, vejo o panel, vejo escrito antes do label, e
sai da rotina (mesma coisa se eu trocar img por pnlSnapshot).
mesmo sintoma se eu trocar a linha do CaptureBitmapData por:
var iShot:ImageSnapshot = ImageSnapshot.captureImage(img,0, new
JPEGEncoder(100.0));
Abraço
Eduardo
> ------------------------------------
>
> Flex-Brasil - A maior lista sobre Adobe Flex do Brasil
> Regras da lista - http://docs.google.com/View?id=ajjv3tjg5jxf_21cqhpdhf5
> Todos os participantes tem os seguintes benefícios:
> + 35% de desconto em livros da O'Reilly ou Peachpit
>
> Site Oficial Flex : http://www.flex.org
> Visite nosso site : http://groups.adobe.com/groups/8024da86da/summary
> -------------
> Conheça a AIR-Brasil a comunidade sobre Adobe AIR
> Visite o site:http://groups.google.com/group/air-brasil
>
> Links do Yahoo! Grupos
>
>
>
--
[s]
==========================
Eduardo Jedliczka
Apucarana - Pr
==========================
E isso funciona?
http://flexmonkey.blogspot.com/2008/03/getting-bitmapdata-from-external-image.html
Sobre crop, além disso que o Mario falou, podes usar máscaras. Olha a propriedade mask, dos DisplayObjectContainers (como o Canvas etc etc)
Eduardo,
Tu das cursos de Flex 3?, tus ejemplos son lo maximo.
Saludos desde Lima - Peru
FG
Gabriela,
Muito interessante o link que você postou, mas infelizmente também não
funcionou...
coloquei
img.addEventListener(FlexEvent.UPDATE_COMPLETE, imageLoadedHandler);
tanto após o img.load, quanto antes do img.load
e simplesmente não entra na função imageLoaderHandler!
vou fazer mais alguns testes e qualquer novidade eu posto aqui no grupo.
abraço
Eduardo
2009/8/19 gabriela.perry <gabrielaperry@hotmail.com>:
> E isso funciona?
> http://flexmonkey.blogspot.com/2008/03/getting-bitmapdata-from-external-image.html
>
> Sobre crop, além disso que o Mario falou, podes usar máscaras. Olha a propriedade mask, dos DisplayObjectContainers (como o Canvas etc etc)
>
>
>
> ------------------------------------
>
> Flex-Brasil - A maior lista sobre Adobe Flex do Brasil
> Regras da lista - http://docs.google.com/View?id=ajjv3tjg5jxf_21cqhpdhf5
> Todos os participantes tem os seguintes benefícios:
> + 35% de desconto em livros da O'Reilly ou Peachpit
>
> Site Oficial Flex : http://www.flex.org
> Visite nosso site : http://groups.adobe.com/groups/8024da86da/summary
> -------------
> Conheça a AIR-Brasil a comunidade sobre Adobe AIR
> Visite o site:http://groups.google.com/group/air-brasil
>
> Links do Yahoo! Grupos
>
>
>
--
[s]
==========================
Eduardo Jedliczka
Apucarana - Pr
==========================
<?xml version="1.0" encoding="utf-8"?>
<mx:Application
xmlns:mx="http://www.adobe.com/2006/mxml"
layout="vertical"
creationComplete="init();"
width="300" height="400">
<mx:Script>
<![CDATA[
import mx.core.UIComponent;
private var fileRef:FileReference;
private var b:Bitmap;
private function init():void {
fileRef = new FileReference();
fileRef.addEventListener(Event.SELECT, fileRef_select);
fileRef.addEventListener(Event.COMPLETE, fileReference_complete);
}
private function browseAndUpload():void {
fileRef.browse();
}
private function fileReference_complete(evt:Event):void {
im.source = fileRef.data;
}
private function fileRef_select(evt:Event):void {
fileRef.load();
im.source=fileRef.data
//im.load(fileRef.data)
im.addEventListener(Event.COMPLETE, show_image)
}
private function show_image(evt:Event):void{
var bitmapData:BitmapData=new BitmapData(Image(evt.currentTarget).content.width,
Image(evt.currentTarget).content.height)
bitmapData.draw(im,new Matrix());
b=new Bitmap(bitmapData,"auto", false)
var c:UIComponent=new UIComponent;
c.addChild(b);
addChild(c);
}
]]>
</mx:Script>
<mx:Button label="Upload file" click="browseAndUpload();" />
<mx:Image id="im"/>
</mx:Application>
Gabriela,
obrigado pelo exemplo... ele funcionou perfeitamente...
dentro da função show_image(...) eu coloquei a seguinte linha:
Alert('width: ' +Image(evt.currentTarget).content.width + ' /
heigth: ' +Image(evt.currentTarget).content.height);
mas nada foi exibido na tela.... resolvi então trocar o Alert pelo
label e funcionou perfeitamente.
sendo assim, constatei apenas duas diferenças no código que eu estava
usando aqui com o seu.
a 1ª se deve ao fato de eu estar usando im.load ao invés de im.source.
a 2ª é que eu só tinha um listener no Event.COMPLETE (no fileRef) e
tinha tentado (sem sucesso) até usar um callLater para contornar o
problema. Acredito que era este o problema... eu estava tentando
copiar a imagem antes dela ser carregada no image. (se fosse no Delphi
eu usaria um Application.ProcessMessages...)
Sendo assim, obrigado à todos pela atenção, pelas respostas
pertinentes e rápidas.
Mais uma vez, obrigado.
2009/8/19 gabriela.perry <gabrielaperry@hotmail.com>:
> ------------------------------------
>
> Flex-Brasil - A maior lista sobre Adobe Flex do Brasil
> Regras da lista - http://docs.google.com/View?id=ajjv3tjg5jxf_21cqhpdhf5
> Todos os participantes tem os seguintes benefícios:
> + 35% de desconto em livros da O'Reilly ou Peachpit
>
> Site Oficial Flex : http://www.flex.org
> Visite nosso site : http://groups.adobe.com/groups/8024da86da/summary
> -------------
> Conheça a AIR-Brasil a comunidade sobre Adobe AIR
> Visite o site:http://groups.google.com/group/air-brasil
>
> Links do Yahoo! Grupos
>
>
>
Eu não entendo muito mas para FileReference() existe a propriedade data e load ?
________________________________
De: gabriela.perry <gabrielaperry@hotmail.com>
Para: flex-brasil@yahoogrupos.com.br
Enviadas: Quarta-feira, 19 de Agosto de 2009 15:29:45
Assunto: [flex-brasil] Re: Como cortar uma imagem Jpeg ?
<?xml version="1.0" encoding="utf- 8"?>
<mx:Application
xmlns:mx="http://www.adobe. com/2006/ mxml"
layout="vertical"
creationComplete= "init();"
width="300" height="400" >
<mx:Script>
<![CDATA[
import mx.core.UIComponent ;
private var fileRef:FileReferen ce;
private var b:Bitmap;
private function init():void {
fileRef = new FileReference( );
fileRef.addEventLis tener(Event. SELECT, fileRef_select) ;
fileRef.addEventLis tener(Event. COMPLETE, fileReference_ complete) ;
}
private function browseAndUpload( ):void {
fileRef.browse( );
}
private function fileReference_ complete( evt:Event) :void {
im.source = fileRef.data;
}
private function fileRef_select( evt:Event) :void {
fileRef.load( );
im.source=fileRef. data
//im.load(fileRef. data)
im.addEventListener (Event.COMPLETE, show_image)
}
private function show_image(evt: Event):void{
var bitmapData:BitmapDa ta=new BitmapData(Image( evt.currentTarge t).content. width,
Image(evt.currentTa rget).content. height)
bitmapData.draw( im,new Matrix());
b=new Bitmap(bitmapData, "auto", false)
var c:UIComponent= new UIComponent;
c.addChild(b) ;
addChild(c);
}
]]>
</mx:Script>
<mx:Button label="Upload file" click="browseAndUpl oad();" />
<mx:Image id="im"/>
</mx:Application>
__________________________________________________________
Veja quais são os assuntos do momento no Yahoo! +Buscados
http://br.maisbuscados.yahoo.com
[As partes desta mensagem que não continham texto foram removidas]
se exportar para o player 10....
Só pra fechar o tópico (mais um pouco de paciencia do pessoal, que esse post ta com 13 replies!!!!):
- 1ª se deve ao fato de eu estar usando im.load ao invés de im.source.
Não faz diferença....
- 2ª é que eu só tinha um listener no Event.COMPLETE (no fileRef) e
tinha tentado (sem sucesso) até usar um callLater para contornar o
problema. Acredito que era este o problema... eu estava tentando
copiar a imagem antes dela ser carregada no image. (se fosse no Delphi
eu usaria um Application.ProcessMessages...)
Correto...
Sim, ministro treinamento em programação Adobe Flex, atualmente só
presencia.
*Eduardo Kraus*
Desenvolvedor
eduardokraus@gmail.com
http://blog.mxml.com.br
http://twitter.com/EduardoKraus
2009/8/19 Fredy Gonzales <fredyg1965@gmail.com>
>
>
> Eduardo,
>
> Tu das cursos de Flex 3?, tus ejemplos son lo maximo.
>
> Saludos desde Lima - Peru
>
> FG
>
>
> ----- Original Message -----
> From: Eduardo Kraus
> To: flex-brasil@yahoogrupos.com.br <flex-brasil%40yahoogrupos.com.br>
> Sent: Wednesday, August 19, 2009 7:30 AM
> Subject: Re: [flex-brasil] Como cortar uma imagem Jpeg ?
>
> usa o ImageSnapshot
>
> Tem um exemplo aqui.
>
> http://blog.mxml.com.br/adobe-flex-com-relatorio-em-pdf
>
> *Eduardo Kraus*
> Desenvolvedor
> eduardokraus@gmail.com <eduardokraus%40gmail.com>
> http://blog.mxml.com.br
> http://twitter.com/EduardoKraus
>
> 2009/8/19 Eduardo Jedliczka <edujed@gmail.com <edujed%40gmail.com>>