Как изменить размер изображения, загруженного пользователем, и сохранить его в базе данных - PullRequest
0 голосов
/ 12 января 2020

Здравствуйте, ребята. Я прочитал много статей о том, как изменить размер изображения и сохранить его в SQL.

Прежде чем я опубликую свою проблему, я объясню больше: я работаю в WinForms, с базой данных SQL. Пользователи будут загружать изображения в SQL.

. Я хочу изменить размер изображения перед его сохранением. Загруженное изображение будет показано в PictureBox.

Тип данных SQL - Image.

Вот мой код при загрузке изображения:

private void BUpload_Click(object sender, EventArgs e)
{
    if (CmbImo.SelectedIndex != -1) { 
        OpenFileDialog open = new OpenFileDialog();
        open.Filter = "Image Files(*.jpeg;*.bmp;*.png;*.jpg)|*.jpeg;*.bmp;*.png;*.jpg";

        if (open.ShowDialog() == DialogResult.OK)
        {
            pictureBox1.Text = open.FileName;
            pictureBox1.Image = Image.FromFile(open.FileName);
            pictureBox1.Image = resizeImage(pictureBox1.Image, new Size(430, 344));
        }
        else
        {
            label2.ForeColor = Color.Red;
            label2.Text = "Are you sure you dont want to upload an image !!";
        }
    }
    else
    {
        MessageBox.Show("Please Do Select an Imo !!");
    }
    pictureBox1.Visible = true;
}

Вот моя процедура изменения размера:

public static Image resizeImage(Image imgToResize, Size size)
{
    return (Image)(new Bitmap(imgToResize, size));
}

Вот моя вставка в таблицу:

public void SaveATLast()
{
    cnx.Close();
    string image = pictureBox1.Text;

    if (CmbImo.SelectedIndex != -1 && textBox1.Text!="" && textBox3.Text != "")
    { 
        cnx.Open();
            // string image = pictureBox1.Text;
        Bitmap bmp = new Bitmap(image);

        FileStream fs = new FileStream(image, FileMode.Open, FileAccess.Read);
        byte[] bimage = new byte[fs.Length];
        fs.Read(bimage, 0, Convert.ToInt32(fs.Length));

        fs.Close();

        SqlCommand cmd = new SqlCommand(" insert into Baa (Imo, Height, Name, ImageB, BPlug, APlug) values (@Imo, @Height, @Name, @imgdata, @BPlug, @APlug)", cnx);

        cmd.Parameters.AddWithValue("@Imo", SqlDbType.Int).Value = CmbImo.SelectedItem.ToString();
        cmd.Parameters.AddWithValue("@Height", SqlDbType.VarChar).Value = textBox3.Text;
        cmd.Parameters.AddWithValue("@Name", SqlDbType.VarChar).Value = textBox1.Text;
        cmd.Parameters.AddWithValue("@imgdata", SqlDbType.Image).Value = bimage;
        cmd.Parameters.AddWithValue("@BPlug", SqlDbType.VarChar).Value = textBox4.Text;
        cmd.Parameters.AddWithValue("@APlug", SqlDbType.Int).Value = textBox2.Text;
        comboBox1.SelectedItem.ToString();

        cmd.ExecuteNonQuery();
        cnx.Close();

        // this.Close();
        textBox1.Clear();
        textBox3.Clear();
        textBox2.Clear();
        textBox4.Clear();
        pictureBox1.Image = null;
    }
    else
    {
        MessageBox.Show("Please do fill out all textboxes!");
    }
}

Просто чтобы быть более понятным, пользователь загружает изображение, которое он получает, в PictureBox, в PictureBox оно фактически ИЗМЕНЯЕТСЯ, но как только пользователь нажимает кнопку добавления, где вызывается SaveAtLast(), это фактически сохраняет изображение в таблицу с нормальным размером. а не измененный размер, который на самом деле находится в PictureBox.

Я действительно надеюсь, что это не имеет никакого отношения к типу изображения, потому что я читаю, как-то люди рекомендуют использовать VarBinary вместо Image.

Заранее спасибо, ребята.

РЕДАКТИРОВАТЬ: пожалуйста, парни, не знаю, помечено ли это как решенное или нет для всех, у кого такая же проблема с вставкой этих изображений в sql Пожалуйста, прочитайте комментарии ниже. Дай и Хабиб. Комментарий - это то, что помогло мне понять и что происходит с этими байтовыми изображениями и как осуществляется хранение, плюс эта статья, если вы также можете прочитать об этом https://www.codeproject.com/Articles/25956/Sending-Receiving-PictureBox-Image-in-C-To-From-Mi

1 Ответ

0 голосов
/ 12 января 2020

Нет проблем с кодом изменения размера вашего изображения. В функции SaveATLast вы снова загружаете изображение из файла, исходный файл которого не был изменен, поскольку измененное изображение находится в pictureBox1.

. Вы должны получить измененное изображение из pictureBox1 для сохранения в БД. , а не из файла.

public void SaveATLast()
{
    cnx.Close();
    string image = pictureBox1.Text;

    if (CmbImo.SelectedIndex != -1 && textBox1.Text!="" && textBox3.Text != "")
    { 
        cnx.Open();
        using (MemoryStream ms = new MemoryStream())
        {
            pictureBox1.Image.Save(ms,pictureBox1.Image.RawFormat);
            byte[] bimage = new byte[ms.Length];
            ms.Write(bimage, 0, (int)ms.Length);
            //DB Opeartions stuff
            SqlCommand cmd = new SqlCommand(" insert into Baa ( Imo , Height  ,Name , ImageB,BPlug,APlug) values ( @Imo, @Height , @Name , @imgdata,@BPlug,@APlug)", cnx);

            cmd.Parameters.AddWithValue("@Imo", SqlDbType.Int).Value = CmbImo.SelectedItem.ToString();
            cmd.Parameters.AddWithValue("@Height", SqlDbType.VarChar).Value = textBox3.Text;
            cmd.Parameters.AddWithValue("@Name", SqlDbType.VarChar).Value = textBox1.Text;
            cmd.Parameters.AddWithValue("@imgdata", SqlDbType.Image).Value = bimage;
            cmd.Parameters.AddWithValue("@BPlug", SqlDbType.VarChar).Value = textBox4.Text;
            cmd.Parameters.AddWithValue("@APlug", SqlDbType.Int).Value = textBox2.Text;
            comboBox1.SelectedItem.ToString();

            cmd.ExecuteNonQuery();
            cnx.Close();
        }

        //this.Close();
        textBox1.Clear();
        textBox3.Clear();
        textBox2.Clear();
        textBox4.Clear();
        pictureBox1.Image = null;
    }
    else
    {
        MessageBox.Show("please Do Fill all Textboxes !!");
    }
}    

Отредактировано

Это сохранит изображение в виде несжатого изображения DIB BMP, что неэффективно использует пространство , @ Dai

Таким образом, мы должны использовать Graphics для масштабирования изображения.

public static Image resizeImage(Image image, int width, int height)
{
    var destRect = new Rectangle(0, 0, width, height);
    var destImage = new Bitmap(width, height);

    destImage.SetResolution(image.HorizontalResolution, image.VerticalResolution);

    using (var graphics = Graphics.FromImage(destImage))
    {
        graphics.DrawImage(image, destRect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel);

    }

    return destImage;
}

и использовать resizeImage функцию внутри SaveATLast

var scaledImage = ResizeImage(Image.FromFile(pictureBox1.Text), 430, 344);
var ms = new MemoryStream();
scaledImage.Save(ms, scaledImage.RawFormat);
byte[] bimage = new byte[ms.Length];
ms.Write(bimage, 0, (int)ms.Length);
ms.Close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...