【问题标题】:Show image with only 50% Quality in standard Picturebox在标准 Picturebox 中显示只有 50% 质量的图像
【发布时间】:2016-01-18 09:58:57
【问题描述】:

我想在 C# winForms 应用程序上显示一个图像,但只有 50% 的质量,是否可以使用标准的 Picturebox?

也许以编程方式将图像大小调整为大小的 50%,然后将其拉伸到图片框?

Image img = Image.FromFile(imgFile)

** 在此处调整图像大小,或执行其他操作 **

pictureBox.Image = img;
pictureBox.SizeMode = PictureBoxSizeMode.StretchImage;

【问题讨论】:

  • 为什么需要调整大小?
  • 50% quality 到底是什么意思?
  • @Jens,在某些转换器中您可以选择 JPEG 质量,这就是我想要的
  • 好的,这与拉伸图像有根本的不同,我可以在评论中说这么多。
  • “质量”是编解码器的参数,编解码器是创建图像文件的软件。 JPEG 编解码器特别使用它,质量越低,它可以创建的文件越小。它对 PictureBox 没有任何意义,您总是按原样看到像素。这并不是说你不能让它看起来更糟,让它比图像尺寸更小或更大。使用 Bitmap(Image, int, int) 构造函数来创建这样一个更糟糕的图像。传递一个小的宽度/高度以获得一个小图像,当你再次拉伸它时看起来很糟糕。

标签: c# winforms


【解决方案1】:

您可以通过以下功能更改图片质量,

private void VaryQualityLevel()
{
    // Get a bitmap.
    Bitmap bmp1 = new Bitmap(@"c:\TestPhoto.jpg");
    ImageCodecInfo jgpEncoder = GetEncoder(ImageFormat.Jpeg);

    // Create an Encoder object based on the GUID
    // for the Quality parameter category.
    System.Drawing.Imaging.Encoder myEncoder =
        System.Drawing.Imaging.Encoder.Quality;

    // Create an EncoderParameters object.
    // An EncoderParameters object has an array of EncoderParameter
    // objects. In this case, there is only one
    // EncoderParameter object in the array.
    EncoderParameters myEncoderParameters = new EncoderParameters(1);

    EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, 
        50L);
    myEncoderParameters.Param[0] = myEncoderParameter;
    bmp1.Save(@"c:\TestPhotoQualityFifty.jpg", jgpEncoder, 
        myEncoderParameters);

    myEncoderParameter = new EncoderParameter(myEncoder, 100L);
    myEncoderParameters.Param[0] = myEncoderParameter;
    bmp1.Save(@"c:\TestPhotoQualityHundred.jpg", jgpEncoder, 
        myEncoderParameters);

    // Save the bitmap as a JPG file with zero quality level compression.
    myEncoderParameter = new EncoderParameter(myEncoder, 0L);
    myEncoderParameters.Param[0] = myEncoderParameter;
    bmp1.Save(@"c:\TestPhotoQualityZero.jpg", jgpEncoder, 
        myEncoderParameters);

}

在图片框上分配 50% 质量图像后,

pictureBox.Image = "c:\TestPhotoQualityFifty.jpg";

验证此stackoverflow.com/questions/1484759/quality-of-a-saved-jpg-in-c-sharp

【讨论】:

  • 谢谢你,正是我需要的,就像一个魅力
【解决方案2】:

我建议你先阅读这篇文章-
How to: Set JPEG Compression Level
Turning off JPEG color downsampling for Bitmap.Save()

您可以将其保存到 MemoryStream,然后从中加载新的位图 内存流。

试试这个方法:

// Get a bitmap.
Bitmap bmp1 = new Bitmap(@"c:\TestPhoto.jpg");
ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg);

// Create an Encoder object based on the GUID
// for the Quality parameter category.
System.Drawing.Imaging.Encoder myEncoder =
    System.Drawing.Imaging.Encoder.Quality;

// Create an EncoderParameters object.
// An EncoderParameters object has an array of EncoderParameter
// objects. In this case, there is only one
// EncoderParameter object in the array.
EncoderParameters myEncoderParameters = new EncoderParameters(1);

EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, 50L);
myEncoderParameters.Param[0] = myEncoderParameter;
MemoryStream ms = new MemoryStream();
bmp1.Save(ms, jpgEncoder, myEncoderParameters); 
pictureBox.Image = Image.FromStream(ms);

.....

private ImageCodecInfo GetEncoder(ImageFormat format)
{

    ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();

    foreach (ImageCodecInfo codec in codecs)
    {
        if (codec.FormatID == format.Guid)
        {
            return codec;
        }
    }
    return null;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-05
    • 2021-09-20
    • 1970-01-01
    相关资源
    最近更新 更多