none
Dúvidas sobre captura de imagem com Silverlight RRS feed

  • 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

    sábado, 27 de outubro de 2012 01:48

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
    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. 


    quarta-feira, 31 de outubro de 2012 16:47
  • 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
    quarta-feira, 31 de outubro de 2012 16:58
  • 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
    sábado, 17 de novembro de 2012 12:38