【问题标题】:How to resize an Image that a user uploaded and store it in a database如何调整用户上传的图像大小并将其存储在数据库中
【发布时间】:2020-01-12 02:08:43
【问题描述】:

大家好,我已经阅读了很多关于调整图像大小并将其存储到 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 中它实际上是 RESIZED 但是一旦使用点击添加按钮,其中SaveAtLast() 被称为它实际上将图像保存到正常大小的表格中,而不是实际在 PictureBox 中的已调整大小的。

我真的希望它与图像类型无关,因为我读到有人建议使用VarBinary 而不是Image

提前谢谢各位。

编辑: 请伙计们,我不知道这是否标记为已解决,对于将这些图像插入到 sql 时遇到相同问题的每个人,请阅读 Dai 和 Habib 下面的 cmets 评论是帮助我理解这个字节图像中发生了什么以及如何存储完成,如果您也可以阅读这篇文章,请加上这篇文章 https://www.codeproject.com/Articles/25956/Sending-Receiving-PictureBox-Image-in-C-To-From-Mi

【问题讨论】:

标签: c# sql-server winforms


【解决方案1】:

您的图像大小调整代码没有问题。在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 图像,这是一个 空间利用效率低下。 @戴

所以我们应该使用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;
}

并在SaveATLast中使用resizeImage函数

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();

【讨论】:

  • 这会将图像保存为未压缩的DIB BMP图像,这是对空间的低效使用。
  • 好的。然后从文件中加载图像并在保存到数据库时修改大小。
  • 您发布的更新代码仍然没有压缩 BMP 图像。此外,PictureBox 实际上并没有提供调整大小(缩放转换)的图像 - pictureBox.Image 总是返回相同的 Image 对象。您需要使用Graphics.DrawImage 进行图像缩放转换。
  • 是的,现在我已经使用 Graphics.DrawImage 进行缩放转换了。
  • 将图像保存到 MemoryStream 后,您只需要[MemoryStream].Position = 0[bytes] = ms.ToArray()scaledImage.RawFormat 应替换为(在此上下文中)ImageFormat.Png
猜你喜欢
  • 2021-04-10
  • 2021-12-08
  • 2017-10-09
  • 2013-04-19
  • 2011-12-15
  • 1970-01-01
  • 2021-11-26
  • 2016-10-12
  • 1970-01-01
相关资源
最近更新 更多