gpt4 book ai didi

wpf - 将图像加载到 ImageSource - 不正确的宽度和高度

转载 作者:行者123 更新时间:2023-12-03 21:11:52 25 4
gpt4 key购买 nike

我的问题是图像加载似乎来自应用程序资源不正确。这是代码:

    BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.UriSource = new Uri(@"pack://application:,,,/WpfApplication3;component/Resources/Images/16x16_incorrect.png", UriKind.Absolute);
bi.EndInit();

ImageSource s = bi;

图片文件 16x16_incorrect.png是 16x16 32bpp PNG 文件,但执行上述代码后, s.Width = s.Height = 21,59729 ....我还有另一个文件 - 16x16_correct.png ,加载时,ImageSource 的 WidthHeight等于 16,002。

其他图像每个都加载不正确并且看起来模糊(或平滑),因为系统将其从 16x16 拉伸(stretch)到 21x21。
  • 正确图像:Correct Image
  • 图片不正确:Incorrect Image

  • 这是什么原因造成的?如果源图像文件有问题,我该如何更改 ImageSource.Width到所需的大小才能使用此文件?

    最佳答案

    如果您不想从外部更改 DPI,可以这样做:

    public static BitmapSource ConvertBitmapTo96DPI(BitmapImage bitmapImage)
    {
    double dpi = 96;
    int width = bitmapImage.PixelWidth;
    int height = bitmapImage.PixelHeight;

    int stride = width * bitmapImage.Format.BitsPerPixel;
    byte[] pixelData = new byte[stride * height];
    bitmapImage.CopyPixels(pixelData, stride, 0);

    return BitmapSource.Create(width, height, dpi, dpi, bitmapImage.Format, null, pixelData, stride);
    }

    如果您只需要 Image.Source.Width/Height 中的正确值,您可以像我一样执行以下操作:
    this.myImage.Tag = new double[] { bitmapImage.DpiX, bitmapImage.DpiY };
    this.myImage.Source = bitmapImage;

    并像这样调整它的大小:
    public static void ResizeImage(Image img, double maxWidth, double maxHeight)
    {
    if (img == null || img.Source == null)
    return;

    double srcWidth = img.Source.Width;
    double srcHeight = img.Source.Height;

    // Set your image tag to the sources DPI value for smart resizing if DPI != 96
    if (img.Tag != null && img.Tag.GetType() == typeof(double[]))
    {
    double[] DPI = (double[])img.Tag;
    srcWidth = srcWidth / (96 / DPI[0]);
    srcHeight = srcHeight / (96 / DPI[1]);
    }

    double resizedWidth = srcWidth;
    double resizedHeight = srcHeight;

    double aspect = srcWidth / srcHeight;

    if (resizedWidth > maxWidth)
    {
    resizedWidth = maxWidth;
    resizedHeight = resizedWidth / aspect;
    }
    if (resizedHeight > maxHeight)
    {
    aspect = resizedWidth / resizedHeight;
    resizedHeight = maxHeight;
    resizedWidth = resizedHeight * aspect;
    }

    img.Width = resizedWidth;
    img.Height = resizedHeight;
    }

    关于wpf - 将图像加载到 ImageSource - 不正确的宽度和高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3745824/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com