Save image to directory without SaveFileDialog

0

I'm developing an inventory control application and in this application there is a product registration screen:

TheimagesoftheproductsarebeingsavedintheMySQLdatabase.Ireceivedsometipsanditwasnotrecommendedtosaveimagesinthedatabase,becausetheproductsearchfieldonthequeryscreenwasveryslowbecausetheimageisconvertedintoabyteasfollows:

publicvoidCarregaImagem(StringimgCaminho){try{if(string.IsNullOrEmpty(imgCaminho))return;//fornecepropriedadesemétodosdeinstânciaparacriar,copiar,//excluir,mover,eabrirarquivos,eajudanacriaçãodeobjetosFileStreamFileInfoarqImagem=newFileInfo(imgCaminho);//ExpõeumStreamaoredordeumarquivodesuporte//síncronoeassíncronooperaçõesdeleituraegravar.FileStreamfs=newFileStream(imgCaminho,FileMode.Open,FileAccess.Read,FileShare.Read);//alocamemóriaparaovetorthis.ProFoto=newbyte[Convert.ToInt32(arqImagem.Length)];//Lêumblocodebytesdofluxoegravaosdadosemumbufferfornecido.intiBytesRead=fs.Read(this.ProFoto,0,Convert.ToInt32(arqImagem.Length));fs.Close();}catch(Exceptionex){thrownewException(ex.Message.ToString());}}

Andsavedtothebankasfollows:

publicvoidIncluir(ModeloProdutoobj){MySqlCommandcmd=newMySqlCommand();cmd.Connection=conexao.ObjetoConexao;cmd.CommandText="insert into Produto (pro_foto) " +
        "values (@foto); select @@IDENTITY;";
        cmd.Parameters.Add("@foto", MySqlDbType.LongBlob);
        if (obj.ProFoto == null)
        {
            //cmd.Parameters.AddWithValue("@pro_foto", DBNull.Value);
            cmd.Parameters["@foto"].Value = DBNull.Value;
        }
        else
        {
            //cmd.Parameters.AddWithValue("@pro_foto", obj.pro_foto);
            cmd.Parameters["@foto"].Value = obj.ProFoto;
        }
    }

On the query screen, the image is passed from the database to the PictureBox when the user types the name or bar code of the product. But I would like to change that. Instead of saving the image in the database, when the user registers a product and clicks to save, the image will be automatically passed from the PictureBox of the registration screen to a directory inside the program folder and when doing a search on the screen the image to be retrieved from the directory for the PictureBox. The image is also saved with the product code number at the time of registration.

"Add Photo" button on the registration screen:

private void btLoFoto_Click(object sender, EventArgs e)
    {
        try
        {
            OpenFileDialog od = new OpenFileDialog();
            od.ShowDialog();
            if (!string.IsNullOrEmpty(od.FileName))
            {
                this.foto = od.FileName;
                pbFoto.Load(this.foto);
            }
        }
        catch 
        {
            MessageBox.Show("Algum erro ocorreu! Você pode estar tentando enviar outros tipos de arquivos \n" 
                + "que não são imagens, selecione arquivos do tipo .png, .jpg, .bitmap,  por exemplo.", "Erro");
        }
    }

Product query screen:

Codetoretrievethebankimage:

try{MemoryStreamms=newMemoryStream(modelo.ProFoto);pbFoto.Image=Image.FromStream(ms);this.foto="Foto Original";
                }
                catch { }

Product Model Class:

public ModeloProduto(String pro_foto)
       {
           this.CarregaImagem(pro_foto);
       }
public ModeloProduto(byte[] pro_foto)
       {
           this.ProFoto = pro_foto;
       }
private byte[] _pro_foto;
        public byte[] ProFoto
        {
            get { return this._pro_foto; }
            set { this._pro_foto = value; }
        }

public void CarregaImagem(String imgCaminho)
        {
            try
            {
                if (string.IsNullOrEmpty(imgCaminho))
                    return;
                //fornece propriedadese métodos de instância para criar, copiar,
                //excluir, mover, e abrir arquivos, e ajuda na criação de objetos FileStream
                FileInfo arqImagem = new FileInfo(imgCaminho);
                //Expõe um Stream ao redor de um arquivo de suporte
                //síncrono e assíncrono operações de leitura e gravar.
                FileStream fs = new FileStream(imgCaminho, FileMode.Open, FileAccess.Read, FileShare.Read);
                //aloca memória para o vetor
                this.ProFoto = new byte[Convert.ToInt32(arqImagem.Length)];
                //Lê um bloco de bytes do fluxo e grava osdados em um buffer fornecido.
                int iBytesRead = fs.Read(this.ProFoto, 0, Convert.ToInt32(arqImagem.Length));
                fs.Close();
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message.ToString());
            }
        }
    
asked by anonymous 26.07.2016 / 16:15

2 answers

3

As long as the PictureBox contains a valid image, you can retrieve it using the Image property of the component and save it using the Image.Save()

private void SalvarImagem()
{
    pictureBox1.Image.Save("D:\teste.jpg", pictureBox1.Image.RawFormat);
}

Notice that the second parameter of the Save method requests a ImageFormat " (the type of the image - JPG, PNG, etc.), since this information already exists in the image it is possible to recover it without much effort using the RawFormat property. >

Yes, that's all! Of course you will need to do something to put the extension in the filename, but that's just a small detail.

To find a particular file in a specific directory, you must use Directory.GetFiles() . I created a small example for you, obviously have to adapt to your needs, but the basis is that.

public Image buscarImagemProduto(string pastaPadrao, string nomeUnicoArquivo)
{
    string[] arquivos = Directory.GetFiles(pastaPadrao, nomeUnicoArquivo);

    if(arquivos.Length > 1)
        MaisDeUmArquivoEncontrado();
    else if (arquivos.Length == 0)
        NenhumArquivoEncontrado();
    else
        return Image.FromFile(arquivo[0]);

    return null; // Qtd de arquivos é diferente de zero - adapte para suas necessidades
}
    
28.07.2016 / 02:28
0

If it is a windows forms application, the image already exists on the user's pc, so to record you can simply copy the file to your already renaming folder using the Copy function of the File class link ).

To read, you can use the ReadAllBytes function of the same class ( link ) instead of loading from the database.

    
26.07.2016 / 16:24