Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 参数对图像无效。是否保存_C#_Image_Base64 - Fatal编程技术网

C# 参数对图像无效。是否保存

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"))) {

有人看到这里有什么不对劲吗?我在“imageData.Save”行中得到了一个“Parameter is not valid”,但我怀疑imageData变量在此之前是不可靠的,因为我在设置imageData对象后看到imageData对象内部出现了一些参数异常。谢谢你的建议

    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,)看起来很奇怪。又是钚合金!这确实是问题所在!再次感谢您抽出时间来这里!您的代码仅使用默认设置。如果比较文件大小,可能会看到不同。你的没有错,只是没有用