从 HttpPostedFileBase 创建的位图保存的图像比最初上传的文件更暗

本文关键字:文件 创建 HttpPostedFileBase 位图 保存 图像 | 更新日期: 2023-09-27 18:34:25

在我的MVC 5 Web项目中,我正在将作为表单的一部分发布的位图保存到服务器上的文件夹中。 在保存图像时,我还为上传的图像创建了 2 个不同大小的缩略图。 所有三个图像文件都已成功创建,但全尺寸、未修改的图像保存为原始图像的"灰显"版本,并按原样提供。 通过"变暗",我的字面意思是,以全尺寸和未受干扰的方式保存的文件看起来好像在原始图像之上保存了一个 50% 透明的黑色图像层。

以下是将图像保存到磁盘的代码:

private ObservationImage CreateObservationImage(UploadedFileInfo file, Observation obs)
    {
        Guid guid = Guid.NewGuid();
        string p = Path.Combine(Server.MapPath("~/ObservationImages/"), guid.ToString() + ".png");
        string thumb = Path.Combine(Server.MapPath("~/ObservationImages/thumbnails/"), guid.ToString() + ".png");
        string mid = Path.Combine(Server.MapPath("~/ObservationImages/midsize/"), guid.ToString() + ".png");
        Bitmap thisBitmap = new Bitmap(file.File.InputStream);
        ImageCodecInfo codecInfo = GetEncoderInfo("image/png");
        Encoder qualityEncoder = Encoder.Quality;
        Encoder colourDepthEncoder = Encoder.ColorDepth;
        Encoder compressionEncoder = Encoder.Compression;
        EncoderParameters myEncoderParameters = new EncoderParameters(3);
        EncoderParameter myQualityEncoderParameter = new EncoderParameter(qualityEncoder, 100L); // 100% quality
        EncoderParameter myColourDepthEncoderParameter = new EncoderParameter(colourDepthEncoder, 24L); // 24 bpp
        EncoderParameter myCompressionEncoderParameter = new EncoderParameter(compressionEncoder, (long)EncoderValue.CompressionNone); // no compression
        myEncoderParameters.Param[0] = myQualityEncoderParameter;
        myEncoderParameters.Param[1] = myColourDepthEncoderParameter;
        myEncoderParameters.Param[2] = myCompressionEncoderParameter;
        double ratio = (double)thisBitmap.Height / (double)thisBitmap.Width;
        Image.GetThumbnailImageAbort myCallback = new Image.GetThumbnailImageAbort(ThumbnailCallback);
        Image thisThumbnail = thisBitmap.GetThumbnailImage(120, (int)(120 * ratio), myCallback, IntPtr.Zero);
        thisThumbnail.Save(thumb, codecInfo, myEncoderParameters);
        myCallback = new Image.GetThumbnailImageAbort(ThumbnailCallback);
        Image thisMidsize = thisBitmap.GetThumbnailImage(400, (int)(400 * ratio), myCallback, IntPtr.Zero);
        thisMidsize.Save(mid);
        thisBitmap.Save(p, codecInfo, myEncoderParameters);
        ObservationImage result = new ObservationImage
        {
            ImageLocalPath = p,
            ImageURL = "/ObservationImages/" + guid.ToString() + ".png",
            ThumbnailURL = "/ObservationImages/thumbnails/" + guid.ToString() + ".png",
            MidSizeUrl = "/ObservationImages/midsize/" + guid.ToString() + ".png",
            ObservationId = obs.ObservationId
        };
        return result;
    }

UploadedFileInfo 类型来自自定义模型绑定器,该绑定器提供对上传文件的 HttpPostedFileBase 的访问。 thisThumbnail和this中型文件绝对保存,this位图保存如前所述。

现在,这一切都在VS2013使用的开发Web服务器上工作正常,但是当部署到IIS7.5服务器时,会出现"变暗"图像的问题。 我尝试强制使用我能想到的每个编码器参数,但无济于事。缩略图的保存没有任何不良影响。

有些文件确实正确上传,但我看不到相关性 - 例如,原始文件类型和大小似乎没有问题。 这真的让我摸不着头脑,想知道发生了什么。 IIS框(Windows Server 2008 R2(上没有异常设置,如前所述,它在我的开发机器(Windows 7 x64(上运行的VS2013上100%工作。

有人对我应该在哪里寻找有任何指示吗?

从 HttpPostedFileBase 创建的位图保存的图像比最初上传的文件更暗

在本例中,Bitmap.Save 将"未更改"的图像保存为 48bpp,而不是原始的 32bpp。 我不得不将其强制为 32,但我需要使用具有不同位深度的许多其他图像进行测试。