如何在不损失图像质量的情况下使用asp.net压缩图像

本文关键字:asp net 图像 压缩 情况下 损失 图像质量 | 更新日期: 2023-09-27 18:24:44

我必须使用java脚本上传多个图像。所以我需要压缩那些图像,而不会失去图像质量。

我必须将所有图像存储在物理文件夹"上传"中。

HttpFileCollection hfc = Request.Files;
for (int i = 0; i < hfc.Count; i++) {
    HttpPostedFile hpf = hfc[i];
    if (hpf.ContentLength > 0) {
        hpf.SaveAs(Server.MapPath("~/uploads/") +System.IO.Path.GetFileName(hpf.FileName));
    }
}

所以我需要在上传到物理文件夹

如何在不损失图像质量的情况下使用asp.net压缩图像

时压缩图像而不降低图像质量

我建议将图像转换为PNG,然后使用内置的ZIP压缩。

public static void SaveToPNG(Bitmap SourceImage, string DestinationPath)
{
    SourceImage.Save(DestinationPath, ImageFormat.Png);
    CompressFile(DestinationPath, true);
}
private static string CompressFile(string SourceFile, bool DeleteSourceFile)
{
    string TargetZipFileName = Path.ChangeExtension(SourceFile, ".zip");
    using (ZipArchive archive = ZipFile.Open(TargetZipFileName, ZipArchiveMode.Create))
    {
        archive.CreateEntryFromFile(SourceFile, Path.GetFileName(SourceFile),CompressionLevel.Optimal);
    }
    if(DeleteSourceFile == true)
    {
        File.Delete(SourceFile);
    }
    return TargetZipFileName;
}

或者,如果你不介意一点不明显的损失,那么你可以转换成高质量的JPG,然后将其压缩。在100%的质量下,你的用户可能不会注意到任何差异,你的质量越低,图像就会越小,但这违背了你"不损失质量"的条件。

private static ImageCodecInfo __JPEGCodecInfo = null;
private static ImageCodecInfo _JPEGCodecInfo
{
    get
    {
        if (__JPEGCodecInfo == null)
        {
            __JPEGCodecInfo = ImageCodecInfo.GetImageEncoders().ToList().Find(delegate (ImageCodecInfo codec) { return codec.FormatID == ImageFormat.Jpeg.Guid; });
        }
        return __JPEGCodecInfo;
    }
}
public static void SaveToJPEG(Bitmap SourceImage, string DestinationPath, long Quality)
{
    EncoderParameters parameters = new EncoderParameters(1);
    parameters.Param[0] = new EncoderParameter(Encoder.Quality, Quality);
    SourceImage.Save(DestinationPath, _JPEGCodecInfo, parameters);
    CompressFile(DestinationPath, true);
}
private static string CompressFile(string SourceFile, bool DeleteSourceFile)
{
    string TargetZipFileName = Path.ChangeExtension(SourceFile, ".zip");
    using (ZipArchive archive = ZipFile.Open(TargetZipFileName, ZipArchiveMode.Create))
    {
        archive.CreateEntryFromFile(SourceFile, Path.GetFileName(SourceFile),CompressionLevel.Optimal);
    }
    if(DeleteSourceFile == true)
    {
        File.Delete(SourceFile);
    }
    return TargetZipFileName;
}