您需要将上传的文件转换为Image
对象,可以简单地通过以下方式完成:
Image uploaded = Image.FromStream(FileUpload1.PostedFile.InputStream);
接下来,计算出您想要的图像有多大。假设您希望最大尺寸为 256 像素,并保持纵横比。一些代码改编自 CodeProject 文章使用 .NET 动态调整图像大小:
int originalWidth = uploaded.Width;
int originalHeight = uploaded.Height;
float percentWidth = (float)256 / (float)originalWidth;
float percentHeight = (float)256 / (float)originalHeight;
float percent = percentHeight < percentWidth ? percentHeight : percentWidth;
int newWidth = (int)(originalWidth * percent);
int newHeight = (int)(originalHeight * percent);
现在创建一个新的Bitmap
对象来包含调整大小的图像(来自同一篇 CodeProject 文章)并将原始图像绘制到其中:
Image newImage = new Bitmap(newWidth, newHeight);
using (Graphics g = Graphics.FromImage(newImage))
{
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.DrawImage(uploaded, 0, 0, newWidth, newHeight);
}
最后,转换回字节以保存到数据库中:
byte[] results;
using (MemoryStream ms = new MemoryStream())
{
ImageCodecInfo codec = ImageCodecInfo.GetImageEncoders().FirstOrDefault(c => c.FormatID == ImageFormat.Jpeg.Guid);
EncoderParameters jpegParms = new EncoderParameters(1);
jpegParms.Param[0] = new EncoderParameter(Encoder.Quality, 95L);
newImage.Save(ms, codec, jpegParms);
results = ms.ToArray();
}
我走了很长的路来设置输出的质量水平。如果您不介意使用什么压缩级别,一个简单的img.Save(ms, ImageFormat.Jpeg);
call 替换了里面的前 4 行using
代码块。
查看代码项目文章我在上面提到了有关调整图像大小的更多信息,并阅读C# 图像到字节数组和字节数组到图像转换器类(也在 CodeProject 上)了解有关将图像与字节数组相互转换的更多信息。
最后一部分,将图像插入数据库表中。我将假设使用 Microsoft SQL,并执行非常简单的表插入。
表定义为:
CREATE TABLE [Images](
[ID] [int] IDENTITY(1,1) NOT NULL,
[ImageData] [varbinary](max) NULL,
CONSTRAINT [PK_Images] PRIMARY KEY CLUSTERED
(
[ID] ASC
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
以及将图像数据插入表中的代码:
static string connString = "Data Source=localhost; Initial Catalog=project; Integrated Security=True";
public static int InsertImage(byte[] imgdata)
{
using (SqlConnection conn = new SqlConnection(connString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand("INSERT INTO Images(ImageData) OUTPUT inserted.ID VALUES(@p1)", conn))
{
cmd.Parameters.AddWithValue("@p1", imgdata);
int res = (int)cmd.ExecuteScalar()
return res;
}
}
}
返回值是SQL为该记录生成的自增值。
或者更新现有图像:
public static void UpdateImage(int id, byte[] imgdata)
{
using (SqlConnection conn = new SqlConnection(connString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand("UPDATE Images SET ImageData = @p1 WHERE ID = @p2", conn))
{
cmd.Parameters.AddWithValue("@p1", imgdata);
cmd.Parameters.AddWithValue("@p2", id);
cmd.ExecuteNonQuery();
}
}
}