locked
Gravar a imagem de um componente image em um campo do SQL Server 2.008 RRS feed

  • Discussão Geral

  • Amigos,

    Tenho essa estrutura representando a minha tabela de usuários:

     

     

    Int16 codigoUsuario;

     

     

    Int16 codigoEmpresa;

     

     

    Int16 codigoPerfil;

     

     

    string nomeUsuario;

     

     

    string senhaUsuario;

     

     

    byte[] foto;

    [

     

    DataMember]

     

     

    public Int16 CodigoUsuario

    {

     

     

    get { return codigoUsuario; }

     

     

    set

    {

     

     

    if (codigoUsuario != value)

    codigoUsuario =

     

    value;

    RaisedPropertyChanged(

     

    new PropertyChangedEventArgs("CodigoUsuario"));

    }

    }

     

    [

     

    DataMember]

     

     

    public Int16 CodigoEmpresa

    {

     

     

    get { return codigoEmpresa; }

     

     

    set

    {

     

     

    if (codigoEmpresa != value)

    codigoEmpresa =

     

    value;

    RaisedPropertyChanged(

     

    new PropertyChangedEventArgs("CodigoEmpresa"));

    }

    }

    [

     

    DataMember]

     

     

    public Int16 CodigoPerfil

    {

     

     

    get { return codigoPerfil; }

     

     

    set

    {

     

     

    if (codigoPerfil != value)

    codigoPerfil =

     

    value;

    RaisedPropertyChanged(

     

    new PropertyChangedEventArgs("CodigoPerfil"));

    }

    }

    [

     

    DataMember]

     

     

    public string NomeUsuario

    {

     

     

    get { return nomeUsuario; }

     

     

    set

    {

     

     

    if (nomeUsuario != value)

    nomeUsuario =

     

    value;

    RaisedPropertyChanged(

     

    new PropertyChangedEventArgs("NomeUsuario"));

    }

    }

    [

     

    DataMember]

     

     

    public string SenhaUsuario

    {

     

     

    get { return senhaUsuario; }

     

     

    set

    {

     

     

    if (senhaUsuario != value)

    senhaUsuario =

     

    value;

    RaisedPropertyChanged(

     

    new PropertyChangedEventArgs("SenhaUsuario"));

    }

    }

    [

     

    DataMember]

     

     

    public byte[] Foto

    {

     

     

    get { return foto; }

     

     

    set

    {

     

     

    if (foto != value)

    foto =

     

    value;

    RaisedPropertyChanged(

     

    new PropertyChangedEventArgs("Foto"));

    }

    }

    [

     

    DataMember]

     

     

    public string UsuarioGravou { get; set; }

    [

     

    DataMember]

     

     

    public DateTime Data { get; set; }

    [

     

    DataMember]

     

     

    public DateTime Hora { get; set; }

    Na tela de cadastro de usuários que foi feita em SilverLight 4, eu adicionei um componente image que exibe perfeitamente a foto que foi capturada através da WebCam.

    Agora eu gostaria de saber, como eu pego essa imagem e coloco no campo "Foto" da minha estrutura, para depois grava-la no banco. Se eu não estou enganado, eu tenho que converter a imagem do componente para um array de bytes, porém eu não sei como. Desculpe se estou falando bobagem.

    Alguém pode ajudar?

    Um forte abraço.

    quinta-feira, 14 de outubro de 2010 19:56

Todas as Respostas

  • Amigos,

    Gente que coisa complicada essa!

    Bom, vamos ver se isso ajuda para matar este tópico:

    1) A imagem que veio da WebCam, é exibida em um componente image, então eu tenho a propriedade Pixels, que é um array de inteiros. Na minha ignorancia, acredito que todo o conteúdo da foto está sendo exibida nesta propriedade;

    2) Se eu estiver correto, então eu tenho que converter este array de inteiros em um array de bytes. Porém, é possível fazer isso de uma vez ou é necessário percorrer cada elemento e ir convertendo um-a-um?;

    Ficarei extremamente grato se enviarem um exemplo de como se faz isso, porque estou mais perdido do que cachorro quando cai da mudança!!!

    Forte abraço.

    sexta-feira, 15 de outubro de 2010 19:36
  • Amigos,

    Gente que coisa complicada essa!

    Bom, vamos ver se isso ajuda para matar este tópico:

    1) A imagem que veio da WebCam, é exibida em um componente image, então eu tenho a propriedade Pixels, que é um array de inteiros. Na minha ignorancia, acredito que todo o conteúdo da foto está sendo exibida nesta propriedade;

    2) Se eu estiver correto, então eu tenho que converter este array de inteiros em um array de bytes. Porém, é possível fazer isso de uma vez ou é necessário percorrer cada elemento e ir convertendo um-a-um?;

    Ficarei extremamente grato se enviarem um exemplo de como se faz isso, porque estou mais perdido do que cachorro quando cai da mudança!!!

    Forte abraço.

    Olá Marcelo, 

     

    Kra estou com essa mesma duvida, vc conseguiu fazer esse processo de pegar um imagem de um componente Image e salvar no banco sql server??? 

    []´s

     

    Wellington 

     

    quarta-feira, 10 de novembro de 2010 13:45
  • Olá Welligton!

    Perdão pela demora na resposta. eu havia até esquecido desse post pela demora em obter uma resposta.

    Sim eu consegui, depois de muitas horas pesquisando e testando, e agora eu consigo realizar o que desejava.

    Vou postar como eu fiz. Assim vc poderá implantar aí no seu sistema.

    Um forte abraço!

     

    quinta-feira, 18 de novembro de 2010 18:52
  • Opa Marcelos que noticia boa... se puder publicar vai me ajudar bastante.... 

     

    dese ja  Obrigado pela sua ajuda.

     

    Wellington 

     

     

    quinta-feira, 18 de novembro de 2010 19:09
  • Olá Wellington.

    Eu consegui fazendo desta forma:

    1) A primeira tarefa foi utilizar uma biblioteca para converter as imagens que vão estam no componente imagem no formato JPEG, ou em um outro formato da sua preferência. Eu utilizei a biblioteca chamada FJ.Core, e ela pode ser encontrada neste link:http://code.google.com/p/fjcore/, porém fique a vontade para utilizar outras bibliotecas gratuitas que existem por aí;

    2) Após adicionar a bibliote através do reference do seu projeto, você deverá adicionar dois namespace que são: FluxJpeg.Core e FluxJpeg.Core.Encoder;

    3) Na minha página há um componente image que recebe a imagem que vem de uma WebCam, e ele se chama imgWebCam. Abaixo há como eu fiz a conversão:

    byte

     

     

    [] fotoJPeg = new byte[0];

     

     

    int w = (imgWebCam.Source as System.Windows.Media.Imaging.WriteableBitmap).PixelWidth;

     

     

    int h = (imgWebCam.Source as System.Windows.Media.Imaging.WriteableBitmap).PixelHeight;

     

     

    int[] p = (imgWebCam.Source as System.Windows.Media.Imaging.WriteableBitmap).Pixels;

     

     

    byte[][,] pixelsForJpeg = new byte[3][,];

    pixelsForJpeg[0] =

     

    new byte[w, h];

     

     

    // Copio os dados do componente imagem que foi tipado como um WriteableBitmap, para dentro de um buffer da biblioteca FluxJpeg

    int i = 0;

     

     

    for (int y = 0; y < h; y++)

    {

     

     

    for (int x = 0; x < w; x++)

    {

     

     

    int color = p[i++];

    pixelsForJpeg[0][x, y] = (

     

    byte)(color >> 16); // R

    pixelsForJpeg[1][x, y] = (

     

    byte)(color >> 8); // G

    pixelsForJpeg[2][x, y] = (

     

    byte)(color); // B

    }

    }

    pixelsForJpeg[1] =

     

    new byte[w, h];

    pixelsForJpeg[2] =

     

    new byte[w, h];

     

     

    // Codifico a imagem como JPEG usando a biblioteca FluxJpeg e atribuo ela para dentro de um stream

     

     

    ColorModel cm = new ColorModel { colorspace = ColorSpace.RGB };

    FluxJpeg.Core.

     

    Image jpegImage = new FluxJpeg.Core.Image(cm, pixelsForJpeg);

     

     

    MemoryStream stream = new MemoryStream();

     

     

    JpegEncoder encoder = new JpegEncoder(jpegImage, 95, stream);

    encoder.Encode();

    stream.Seek(0,

     

    SeekOrigin.Begin);

    fotoJPeg =

     

    new byte[stream.Length];

     

     

    long bytesRead = stream.Read(fotoJPeg, 0, (int)stream.Length);

    // Abaixo eu atribuo a imagem convertida para o campo que será usado para gravar a imagem em uma tabela no Sql Server

    conta.Foto = fotoJPeg;

    Este processo eu também utilizei no caso de obter uma imgem de um arquivo, exibi-la em um componente imagem e depois grava-la no banco.

    Espero ter ajudado e um forte abraço.

    sexta-feira, 19 de novembro de 2010 09:30
  • Olá Wellington.

    Deu certo o que você queria fazer com o código que eu mandei? Se sim, por favor finalize esta thread.

    Forte abraço.

    sábado, 20 de novembro de 2010 08:03
  • Olá Marcelo, 

     

    Esta gerando um erro de null nesta parte do codigo e ainda não descobrir o porque... tem alguma sugestão?

     

    pixelsForJpeg[0][x, y] = (byte)(color >> 16); // R

    pixelsForJpeg[1][x, y] = (byte)(color >> 8); // G

    pixelsForJpeg[2][x, y] = (byte)(color); // B

     


    sábado, 20 de novembro de 2010 10:10
  • Olá Wellington.

    Antes dele executar o código que você está dizendo que está gerando um null, a imagem tem que estar armazenada no componente image. E tudo começa neste código:

    int

     

     

    w = (imgLogotipo.Source as System.Windows.Media.Imaging.WriteableBitmap).PixelWidth;

     

     

    int h = (imgLogotipo.Source as System.Windows.Media.Imaging.WriteableBitmap).PixelHeight;

     

     

    int[] p = (imgLogotipo.Source as System.Windows.Media.Imaging.WriteableBitmap).Pixels;

    No código acima o objeto que armazena a imagem chama-se imgLogoTipo. Se não foi atribuído nenhum contéudo para ele, ou seja uma imagem, vai acontecer o erro que você está reportando.

    Outra tarefa que precisa ser feita, é obter e usar uma biblioteca como a FJ.Core que eu mencionei. Você conseguiu pegar e colocar no seu código a biblioteca de conversão de imagem chamada FJ.Core?

    Avise se eu puder ajudar em mais alguma coisa.

    Forte abraço.

    segunda-feira, 22 de novembro de 2010 09:46
  • Olá

    então quando ele chega nesta linha em negrito ele carrega somente o primeiro registro dos 3....

      byte[] fotoJPeg = new byte[0];
                    int w = (imMinhaFoto.Source as System.Windows.Media.Imaging.WriteableBitmap).PixelWidth;
                    int h = (imMinhaFoto.Source as System.Windows.Media.Imaging.WriteableBitmap).PixelHeight;
                    int[] p = (imMinhaFoto.Source as System.Windows.Media.Imaging.WriteableBitmap).Pixels;

                    byte[][,] pixelsForJpeg = new byte[3][,];

    --->  AQUI ELE ESTA CARREGANDO NO ARRAY SOMENTE O PRIMEIRO REGISTRO OS OUTROS DOIS ESTA NULL

                    pixelsForJpeg[0] = new byte[w, h];

                    // Copio os dados do componente imagem que foi tipado como um WriteableBitmap, para dentro de um buffer da biblioteca FluxJpeg
                    int i = 0;

                    for (int y = 0; y < h; y++)
                    {
                        for (int x = 0; x < w; x++)
                        {
                            int color = p[i++];
                            pixelsForJpeg[0][x, y] = (byte)(color >> 16); // R
                            pixelsForJpeg[1][x, y] = (byte)(color >> 8); // G
                            pixelsForJpeg[2][x, y] = (byte)(color); // B
                        }
                    }
    segunda-feira, 22 de novembro de 2010 11:50
  • Olá Marcelos, 

     

    Kra obrigado mesmo pela sua ajuda. resolvido o problema... 

     

    Valeu

    quarta-feira, 24 de novembro de 2010 09:33
  • Olá Wellington!

    Cara que legal que conseguiu! Era algum problema no meu código? O que estava pegando?

    Um forte abraço!

     

    quarta-feira, 24 de novembro de 2010 11:03
  • Olá Marcelos, 

     

     

    Com o seu codigo eu entendi como funcionava e modifiquei um pouco o codigo segue abaixo.

     

     

    using System.Net;

    using System.Windows;

    using System.Windows.Controls;

    using System.Windows.Documents;

    using System.Windows.Input;

    using System.Windows.Media;

    using System.Windows.Media.Animation;

    using System.Windows.Media.Imaging;

    using System.Windows.Shapes;

     

    namespace FotoWebcam

    {

        public partial class MainPage : UserControl

        {

            private CaptureSource captureSource;

     

            public MainPage()

            {

                InitializeComponent();

            }

     

            private void button1_Click(object sender, RoutedEventArgs e)

            {

                if(!CaptureDeviceConfiguration.AllowedDeviceAccess)

                {

                    if (!CaptureDeviceConfiguration.RequestDeviceAccess())

                        return;

                }

     

                IniciarWebCam();

            }

     

            private void IniciarWebCam()

            {

                captureSource = new CaptureSource();

                captureSource.VideoCaptureDevice = CaptureDeviceConfiguration.GetDefaultVideoCaptureDevice();

                var videoBrush = new VideoBrush();

                videoBrush.SetSource(captureSource);

                Foto.Fill = videoBrush;

                captureSource.Start();

            }

     

            private void button2_Click(object sender, RoutedEventArgs e)

            {

                captureSource.CaptureImageCompleted += (obj, args) =>

                                                           {

                                                               var imageBrush = new ImageBrush();

                                                               imageBrush.ImageSource = args.Result;

                                                               byte[] bytes = ObterBytes(args.Result);

                                                               NovaFoto.Fill = imageBrush;

                                                           };

                captureSource.CaptureImageAsync();

            }

     

            private byte[] ObterBytes(WriteableBitmap imagem)

            {

                int[] pixels = imagem.Pixels;

                int tamanho = pixels.Length*4;

                byte[] resultado = new byte[tamanho]; //ARGB

                Buffer.BlockCopy(pixels, 0, resultado, 0, tamanho);

                return resultado;

            }

        }

    }



    Obrigado mesmo pela ajuda.

    sexta-feira, 26 de novembro de 2010 05:41