Usuário com melhor resposta
Dúvidas sobre captura de imagem com Silverlight

Pergunta
-
Prezados Colegas, boa noite
Neste 2 últimos dias, montei uma tela de captura de imagem da webcam com silverlight, e fui muito bem sucedido!
Estou no ponte onde capturo a imagem da webcam e através do WRITABLEBITMAP atribuído ao source de um IMAGE, carrego a pré-visualização da mesma.Pesquisei muito e apesar de achar algumas informações ainda não estou bem convencido da forma correta de de se fazer, sendo assim, recorro a vocês:
Nestes testes estou utilizando um banco ACCESS.
1) Com meu IMAGE exibindo a imagem, preciso gravar esta imagem em um banco de dados que pode ser ACCESS (OBJETO OLE) ou SQL SERVER (VARBINARY). Li que para efetuar a gravação preciso converter minha imagem em um ARRAY DE BYTES e achei uma função e converti, até consegui armazernar esta tal conversão no ACCESS com o código abaixo:
public byte[] ConverterImagemArrayBytesImage(Image fotoAtual) { var wb = new WriteableBitmap((int)fotoAtual.ActualWidth, (int)fotoAtual.ActualHeight); int[] p = wb.Pixels; int len = p.Length; byte[] result = new byte[len]; // ARGB Buffer.BlockCopy(p, 0, result, 0, len); return result; }
Para recuperar este registro que consegui gravar, fiz o seguinte:
Tenho uma entidade Pessoa em minha MODEL onde possuo uma propriedade imagemPessoa do tipo byte[], então, chamo meu Async faço uma chamada para camada BLL que faz a consulta no banco e retorna o registro que consegui gravar, porém, na própria BLL, não consigo atribuir o campo retornado no Data Reader para a propriedade imagePessoa da minha entidade Pessoa na model.
foreach (DataRow dtrNcImagem in dtbNcImagem.Rows) { objNcImagem.Add(new ncTesteImagem { Id = dtrNcImagem["Id"] != DBNull.Value ? Convert.ToUInt32(dtrNcImagem["Id"]) : 0, Nome = dtrNcImagem["Nome"] != DBNull.Value ? dtrNcImagem["Nome"].ToString() : string.Empty, ImagemArray = dtrNcImagem["FotoCapturada"], //O ERRO OCORRE NESTA LINHA }); }
Como recupero um campo BYTE[] na BLL passando o valor do mesmo para minha propriedade?
2) Os colegas tem alguma sugestão melhor para fazer este tipo de processamento? Preciso gravar a imagem (objeto Image) no banco e recuperá-la quando retornar um registro.
3) Está função que coloquei acima para converter de Imagem para Array de bytes está correta de modo que grave no banco a imagem corretamente? Se sim qual a forma correta de recuperá-la?
Desde já agradeço a atenção dos colegas!!!
[]'
Eduardo Agostinho Analista Programador - C# Developer
Respostas
-
Bom dia pessoal
Consegui resolver atribuindo o mesmo tamanho do writeableBitmap tanto qdo capturo a imagem quanto quando à carrego!
Obrigado
Eduardo Agostinho Analista Programador - C# Developer
- Marcado como Resposta EAgostinho sábado, 17 de novembro de 2012 12:38
Todas as Respostas
-
possuo um projeto onde a pessoa seleciona a imagem e a imagem depois é salva no BD em Byte[], ao fazer o select do que eu quero eu uso o seguinte para exibir a imagem
static public BitmapImage ConverterImage(byte[] img)
{
MemoryStream stream = new MemoryStream(img);
BitmapImage b = new BitmapImage();
b.SetSource(stream);
return b;
}passo a esse metodo o arry de byte[] que vem do banco de dados e ele retorna no formato que pode ser usado em uma source
img_usuario.Source = ConverterImage(oMembro.mb_foto)
usando esse comando acima eu ja passao ao metodo o que deve ser retornado e ele ja aplica no campo.
-
Olá Felipe, boa tarde...
Primeiramente agradeço sua resposta...
Estou a dias trabalhando esta parte do código e realmente está um tanto complicado!
Coincidência ou não criei a função como você menciona, porém, estou com problema no salvamento do array[] no banco.
Qdo com a função abaixo, transformo minha imagem em array[]:public static byte[] ToByteArray(this WriteableBitmap bmp) { int[] p = bmp.Pixels; int len = p.Length; byte[] result = new byte[len]; // ARGB Buffer.BlockCopy(p, 0, result, 0, len); return result; }
Esse array fica com aproximadamente 15000 elementos.
Agora chamo minha BLL para fazer o insert e é ai que acredito que estou errando:public UInt32 IncluirImagem(ncTesteImagem imagemParaGravar) { ncDB.StrConexao = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\ncDBCON1301.MDB"; //ncDB.StrConexao = @"Provider=SQLOLEDB;Data Source=EDUARDO\SQLEXPRESS;Persist Security Info=True;User ID=sa; PWD=xxxxx; Initial Catalog=Edu3"; UInt32 IdInserido; string sSQL = "INSERT INTO TesteImagem(Nome, FotoCapturada) VALUES ("; sSQL += "@Nome, @FotoCapturada)"; string[] campos = {"@Nome", "@FotoCapturada"}; string[] valores = { imagemParaGravar.Nome, imagemParaGravar.ImagemArray.ToString)}; objBanco = new ncAccessDB(); IdInserido = objBanco.ncExecutarInsertEDU(sSQL, campos, valores); return IdInserido
Abaixo, o código de objBanco.ncExecutarInsertEDU:
public uint ncExecutarInsertEDU(string insertSQL, string[] campos, string[] valores) { try { uint idInserido = 0; DbConnection cnBanco = factory.CreateConnection(); cnBanco.ConnectionString = StrConexaoAcess; DbCommand cmd = factory.CreateCommand(); cmd.Connection = cnBanco; cmd.CommandType = CommandType.Text; cmd.CommandText = insertSQL; cnBanco.Open(); for (int i = 0; i < valores.Length; i++) { DbParameter ProcessandoParam = cmd.CreateParameter(); //ProcessandoParam.DbType = DbType.Byte[]; ProcessandoParam.ParameterName = campos[i]; ProcessandoParam.Value = valores[i]; cmd.Parameters.Add(ProcessandoParam); } cmd.ExecuteScalar(); cmd.CommandType = CommandType.Text; cmd.CommandText = "SELECT @@IDENTITY"; cmd.Connection = cnBanco; idInserido = Convert.ToUInt32(cmd.ExecuteScalar()); return idInserido; } catch (Exception ex) { throw ex; } }
Até consigo fazer o insert, mas quando retorno ele ele está com no máximo 26 elementos!!
Por favor serei muito grato se puder me ajudar nisso, estou desde 5a / 6a feira da semana passada tentando concluir esse código!!!Abraço
Eduardo Agostinho Analista Programador - C# Developer
- Editado EAgostinho quarta-feira, 31 de outubro de 2012 17:07 Erro digitação
-
Bom dia pessoal
Consegui resolver atribuindo o mesmo tamanho do writeableBitmap tanto qdo capturo a imagem quanto quando à carrego!
Obrigado
Eduardo Agostinho Analista Programador - C# Developer
- Marcado como Resposta EAgostinho sábado, 17 de novembro de 2012 12:38