C# 调整位图图像大小
我有这个方法,我想从磁盘加载一张图片,然后将其调整为较小的大小,并将其保存到字节数组中,保存到mysql表中的blob中。据我所知,它正在调整大小,但当我将其保存到表中时,我可以看到字节数组是原始文件大小。但我只想把缩略图保存在表中C# 调整位图图像大小,c#,mysql,wpf,image,bitmap,C#,Mysql,Wpf,Image,Bitmap,我有这个方法,我想从磁盘加载一张图片,然后将其调整为较小的大小,并将其保存到字节数组中,保存到mysql表中的blob中。据我所知,它正在调整大小,但当我将其保存到表中时,我可以看到字节数组是原始文件大小。但我只想把缩略图保存在表中 /// <summary> /// Load and resize image into a byte array. /// </summary> /// <param name="bitmap">
/// <summary>
/// Load and resize image into a byte array.
/// </summary>
/// <param name="bitmap"></param>
/// <param name="FileName"></param>
/// <param name="Width"></param>
/// <param name="Height"></param>
/// <returns></returns>
public Byte[] LoadImageInToByteArray(string FileName, int Width, int Height)
{
BitmapImage bitmap = new BitmapImage();
System.IO.FileStream photoStream = new System.IO.FileStream(FileName, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read);
bitmap.BeginInit();
bitmap.StreamSource = photoStream;
bitmap.CacheOption = BitmapCacheOption.OnLoad;
bitmap.DecodePixelHeight = Height;
bitmap.DecodePixelWidth = Width;
byte[] buffer = BufferFromImage(bitmap);
bitmap.EndInit();
return buffer;
}
/// <summary>
/// Convert BitImage into Byte Array.
/// </summary>
/// <param name="imageSource"></param>
/// <returns></returns>
public Byte[] BufferFromImage(BitmapImage imageSource)
{
byte[] result = null;
if (imageSource != null)
{
using (MemoryStream memStream = new MemoryStream())
{
JpegBitmapEncoder encoder = new JpegBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(imageSource));
encoder.Save(memStream);
result = memStream.ToArray();
}
}
return result;
}
我错过了什么
public static MemoryStream ResizeImageFromStream(Stream stream, String nameOfFile, int width, int height)
{
try
{
Image img;
double ratio;
int newWidth;
int newHeight;
Graphics gfx = null;
img = Image.FromStream(stream);
Image Photo = new Bitmap(img, width, height);
Encoder myEncoder;
EncoderParameter myEncoderParameter;
EncoderParameters myEncoderParameters;
ImageCodecInfo myImageCodecInfo;
myImageCodecInfo = GetEncoderInfo(nameOfFile.Substring(nameOfFile.LastIndexOf(".")).ToLower());
myEncoder = Encoder.Quality;
myEncoderParameters = new EncoderParameters(1);
myEncoderParameter = new EncoderParameter(myEncoder, 87L);
myEncoderParameters.Param[0] = myEncoderParameter;
MemoryStream mstr = new MemoryStream();
gfx = Graphics.FromImage(Photo);
gfx.InterpolationMode = InterpolationMode.HighQualityBicubic;
gfx.SmoothingMode = SmoothingMode.HighQuality;
gfx.PixelOffsetMode = PixelOffsetMode.HighQuality;
gfx.CompositingQuality = CompositingQuality.HighQuality;
gfx.DrawImage(img, 0, 0, width, height);
ImageCodecInfo[] info = ImageCodecInfo.GetImageEncoders();
EncoderParameters encParams = new EncoderParameters(1);
encParams.Param[0] = new EncoderParameter(Encoder.Quality, m_imageQuality);
img.Dispose();
Photo.Save(mstr, info[1],encParams);
Photo.Dispose();
return mstr;
}
catch
{
return new MemoryStream();
}
}
您可以将memorystream转换为字节
? 如果是,那么它可能没有使用新的位图宽度或高度,而是底层流正在一对一地复制。尝试在
BufferFromImage()
之前调用EndInit()。我猜您必须调用EndInit()
。问题是为什么字节数组是空的。你说什么是空的?它是null
还是Length==0
?另外,您没有确认BufferFromImage()
方法的外观(可能值得将其包括在问题中)。我将在问题中添加BufferFromImage。来自调试器:buffer{byte[0]}byte[],这在WPF应用程序中没有多大意义。除此之外,您还可以编辑并取消删除其他答案,而不是编写新答案。
public static MemoryStream ResizeImageFromStream(Stream stream, String nameOfFile, int width, int height)
{
try
{
Image img;
double ratio;
int newWidth;
int newHeight;
Graphics gfx = null;
img = Image.FromStream(stream);
Image Photo = new Bitmap(img, width, height);
Encoder myEncoder;
EncoderParameter myEncoderParameter;
EncoderParameters myEncoderParameters;
ImageCodecInfo myImageCodecInfo;
myImageCodecInfo = GetEncoderInfo(nameOfFile.Substring(nameOfFile.LastIndexOf(".")).ToLower());
myEncoder = Encoder.Quality;
myEncoderParameters = new EncoderParameters(1);
myEncoderParameter = new EncoderParameter(myEncoder, 87L);
myEncoderParameters.Param[0] = myEncoderParameter;
MemoryStream mstr = new MemoryStream();
gfx = Graphics.FromImage(Photo);
gfx.InterpolationMode = InterpolationMode.HighQualityBicubic;
gfx.SmoothingMode = SmoothingMode.HighQuality;
gfx.PixelOffsetMode = PixelOffsetMode.HighQuality;
gfx.CompositingQuality = CompositingQuality.HighQuality;
gfx.DrawImage(img, 0, 0, width, height);
ImageCodecInfo[] info = ImageCodecInfo.GetImageEncoders();
EncoderParameters encParams = new EncoderParameters(1);
encParams.Param[0] = new EncoderParameter(Encoder.Quality, m_imageQuality);
img.Dispose();
Photo.Save(mstr, info[1],encParams);
Photo.Dispose();
return mstr;
}
catch
{
return new MemoryStream();
}
}