c# - C# 从流中调整图像大小
问题描述
我正在尝试从流中调整图像的大小。得到错误
值不能为空。参数名称:编码器
在线上
System.Drawing.Bitmap fullSizeBitmap = new System.Drawing.Bitmap(fullsizeImage, new System.Drawing.Size(width, image_height));
如何在此处添加编码器?我需要它来自原始图像
public static FileProperty UploadImage(IFormFile file, string folderPath, string fileName, FileNote note, int image_height)
{
FileProperty property = new FileProperty();
if (file.Length > 0)
{
MemoryStream ms = new MemoryStream();
file.CopyTo(ms);
var fileBytes = ms.ToArray();
MemoryStream inputMemoryStream = new MemoryStream(fileBytes);
System.Drawing.Image fullsizeImage = System.Drawing.Image.FromStream(inputMemoryStream);
int width = (image_height / fullsizeImage.Height) * fullsizeImage.Width;
System.Drawing.Bitmap fullSizeBitmap = new System.Drawing.Bitmap(fullsizeImage, new System.Drawing.Size(width, image_height));
using (var stream = new MemoryStream())
{
fullSizeBitmap.Save(stream, fullSizeBitmap.RawFormat);
using (MemoryStream memoryStream = new MemoryStream(stream.ToArray()))
{
UploadFromStreamAsync(memoryStream);
}
}
property.FileName = fileName;
property.FileExtention = Path.GetExtension(fileName);
property.FileSize = file.Length;
property.FileType = file.ContentType;
property.FileNote = note.ToString();
}
return property;
}
解决方案
只需用于file.OpenReadStream()
读取和调整文件大小,然后将调整大小的位图保存到MemoryStream
并上传。
bitmap.RawFormat
您可以使用以下方法获取上传的图像格式,而不是使用:
if (file.Length > 0)
{
using(var stream = file.OpenReadStream())
{
var image = Image.FromStream(stream);
int width = (image_height / fullsizeImage.Height) * fullsizeImage.Width;
Bitmap fullSizeBitmap = new Bitmap(fullsizeImage, new Size(width, image_height));
var imgFormat = GetImageFormat(file.FileName);
using(var ms = new MemoryStream())
{
fullSizeBitmap.Save(ms, imgFormat);
UploadFromStreamAsync(ms);
}
}
}
通过文件扩展名获取图像格式的方法:
public ImageFormat GetImageFormat(string fileName)
{
var dotIndex = fileName.LastIndexOf('.');
var ext = fileName.Substring(dotIndex, fileName.Length - dotIndex).ToLower();
switch (ext)
{
case ".bmp": return ImageFormat.Bmp;
case ".emf": return ImageFormat.Emf;
case ".exif": return ImageFormat.Exif;
case ".gif": return ImageFormat.Gif;
case ".icon": return ImageFormat.Icon;
case ".Jpg": return ImageFormat.Jpeg;
case ".Jpeg": return ImageFormat.Jpeg;
case ".png": return ImageFormat.Png;
case ".tiff": return ImageFormat.Tiff;
case ".Wmf": return ImageFormat.Wmf;
default: throw new InvalidDataException("Format not supported");
}
}
如果您仍然需要获取上传的图像编码器信息,请使用以下方法:
// ext: image extension
using System.Drawing.Imaging;
public static ImageCodecInfo GetEncoderInfo(string ext)
{
return ImageCodecInfo.GetImageEncoders().SingleOrDefault(x => x.FilenameExtension.ToLower().Contains(ext));
}
推荐阅读
- android - 错误“路径”参数必须是字符串类型。收到的型号
- vb.net - 如何在不使用继承类的情况下将形状绘制为对象
- angular - 如何编辑 observable?
- c# - ImageMagick.MagickMissingDelegateErrorException 在 C# ImageMagick 中没有此图像格式 CUT 的编码委托
- mysql - 哪个工具可用于对具有相同结构的多个 mysql 数据库进行相同的查询?
- linux - 在安装后例程期间使用 sudo 安装全局包会产生权限错误
- tensorflow - bazel_0_13 + rpi3 -> 构建成功还是失败?
- python - Python Socket TCP连接大小限制?
- python - 3D 笛卡尔网格到球形截面网格的转换
- python-3.x - ModuleNotFoundError:没有名为“pip”的模块