C# 参数对图像无效。是否保存
有人看到这里有什么不对劲吗?我在“imageData.Save”行中得到了一个“Parameter is not valid”,但我怀疑imageData变量在此之前是不可靠的,因为我在设置imageData对象后看到imageData对象内部出现了一些参数异常。谢谢你的建议C# 参数对图像无效。是否保存,c#,image,base64,C#,Image,Base64,有人看到这里有什么不对劲吗?我在“imageData.Save”行中得到了一个“Parameter is not valid”,但我怀疑imageData变量在此之前是不可靠的,因为我在设置imageData对象后看到imageData对象内部出现了一些参数异常。谢谢你的建议 using (Image image = Image.FromFile(Server.MapPath("~/User_Data/asset.png"))) {
using (Image image = Image.FromFile(Server.MapPath("~/User_Data/asset.png")))
{
Image imageData = ResizeImage(image, 120, 120, image.Width, image.Height);
string base64String = this.ImageToBase64String(imageData, ImageFormat.Png);
<snip>
}
public string ImageToBase64String(Image imageData, ImageFormat format)
{
using (var stream = new MemoryStream())
{
imageData.Save(stream, format);
return Convert.ToBase64String(stream.ToArray());
}
}
public Image ResizeImage(Image image, int canvasWidth, int canvasHeight, int originalWidth, int originalHeight)
{
using (Image image2 = new Bitmap(canvasWidth, canvasHeight))
using (Graphics graphics = Graphics.FromImage(image2))
{
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.SmoothingMode = SmoothingMode.HighQuality;
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
graphics.CompositingQuality = CompositingQuality.HighQuality;
double num = ((double)canvasWidth) / ((double)originalWidth);
double num2 = ((double)canvasHeight) / ((double)originalHeight);
double num3 = (num < num2) ? num : num2;
int height = Convert.ToInt32((double)(originalHeight * num3));
int width = Convert.ToInt32((double)(originalWidth * num3));
int x = Convert.ToInt32((double)((canvasWidth - (originalWidth * num3)) / 2.0));
int y = Convert.ToInt32((double)((canvasHeight - (originalHeight * num3)) / 2.0));
graphics.Clear(Color.White);
graphics.DrawImage(image, x, y, width, height);
ImageCodecInfo.GetImageEncoders();
using (var parameters = new EncoderParameters(1))
{
parameters.Param[0] = new EncoderParameter(Encoder.Quality, 100L);
}
return image2;
}
}
使用(Image=Image.FromFile(Server.MapPath(“~/User\u Data/asset.png”))
{
Image-imageData=ResizeImage(Image,120,120,Image.Width,Image.Height);
string base64String=this.ImageToBase64String(imageData,ImageFormat.Png);
}
公共字符串ImageToBase64字符串(图像图像数据,图像格式)
{
使用(var stream=new MemoryStream())
{
保存(流、格式);
返回Convert.ToBase64String(stream.ToArray());
}
}
公共图像大小图像(图像图像,int canvaswitch,int canvaswitch,int originalWidth,int originalHeight)
{
使用(图像image2=新位图(画布宽度、画布高度))
使用(Graphics=Graphics.FromImage(image2))
{
graphics.InterpolationMode=InterpolationMode.HighQualityBicubic;
graphics.SmoothingMode=SmoothingMode.HighQuality;
graphics.PixelOffsetMode=PixelOffsetMode.HighQuality;
graphics.CompositingQuality=CompositingQuality.HighQuality;
双数值=((双)画布宽度)/((双)原始宽度);
双num2=((双)画布高度)/((双)原始高度);
双num3=(num
这是我的调试器的屏幕截图…这在imageData建立之后和调用ImageToBase64String之前立即停止。imageData中的这些异常不会使应用程序崩溃,但看起来肯定不对吧?
简单的回答是,您正在通过
using
块处理图像2
,然后尝试在方法之外使用它。如果检查ImageData
,您将看到各种不良数据和异常:
如果你要退货,不要把它处理掉;调用代码将负责处理以下情况:
//using (Image image2 = new Bitmap(canvasWidth, canvasHeight))
Image image2 = new Bitmap(canvasWidth, canvasHeight);
using (Graphics graphics = Graphics.FromImage(image2))
{
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
...
}
return image2;
有一种更简单的方法来缩放图像,而codec/quality param代码什么都不做
public Image ResizeImage2(Image image, int canvasWidth, int canvasHeight)
{
// org size is already available
Size orginalSize = image.Size;
Size newSize = Size.Empty;
float scale;
if (canvasWidth != 0)
{
scale = (float)orginalSize.Height / orginalSize.Width;
newSize = new Size(canvasWidth, Convert.ToInt32(scale * canvasWidth));
}
else if (canvasHeight != 0)
{
scale = (float)orginalSize.Width / orginalSize.Height;
newSize = new Size(Convert.ToInt32(scale * canvasHeight), canvasHeight);
}
//using (Image image2 = new Bitmap(canvasWidth, canvasHeight))
Image image2 = new Bitmap(newSize.Width, newSize.Height);
using (Graphics graphics = Graphics.FromImage(image2))
{
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.SmoothingMode = SmoothingMode.HighQuality;
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
graphics.CompositingQuality = CompositingQuality.HighQuality;
graphics.Clear(Color.White);
graphics.DrawImage(image, 0, 0, newSize.Width, newSize.Height);
return image2;
}
}
这将基于目标宽度或高度缩放传递的图像,并使用较少的变量。已删除编解码器内容,因为您将使用Save方法:
using (Image img = Image.FromFile(@"C:\Temp\BigHead.jpg"))
{
// resize img to the height of a PicBox
Image imageData = ResizeImage2(img, 0, pb2.Height);
// winforms show img
pb2.Image = imageData;
// get codec
ImageCodecInfo codec = ImageCodecInfo.GetImageEncoders()
.FirstOrDefault(z => z.MimeType == "image/jpeg");
using (var qparam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L))
{
EncoderParameters encParams = new EncoderParameters(1);
encParams.Param[0] = qparam;
imageData.Save(@"C:\Temp\BigHead_thumb.jpg", codec, encParams);
// test: no encoder
imageData.Save(@"C:\Temp\BigHead_thumb2.jpg");
}
// ToDo: dispose of returned image
}
调用代码可以查看图像并决定是按高度缩放还是按宽度缩放。如果要指定非默认质量级别,则Image.Save
方法将使用编码器
生成的文件大小反映了编码器的影响:默认方法为72k,使用Quality参数为194k。您是在运行时还是编译时收到此错误?看起来是有效调用。运行时发生参数无效错误。(文件确实存在):)添加调试器的屏幕截图,以尝试显示ImageDatas的古怪性这过去工作得很好…我一定错过了一些愚蠢的东西。只是需要一双额外的眼睛,因为我只是没有看到它!你的图像都是正方形的吗?相同的H到W比例?绝对尺寸(120,120,)看起来很奇怪。又是钚合金!这确实是问题所在!再次感谢您抽出时间来这里!您的代码仅使用默认设置。如果比较文件大小,可能会看到不同。你的没有错,只是没有用