【问题标题】:Resize BitmapImage [duplicate]调整位图图像大小 [重复]
【发布时间】:2016-05-31 12:07:54
【问题描述】:

我有这个方法,我想从磁盘加载一张图片,然后将其调整为较小的大小并将其保存到字节数组中,以保存到mysql表中的blob中。据我所知,它正在调整大小,但是当我将其保存到表中时,我可以看到字节数组是原始文件大小。但我只想将缩略图保存在表格中。

    /// <summary>
    /// Load and resize image into a byte array.
    /// </summary>
    /// <param name="bitmap"></param>
    /// <param name="FileName"></param>
    /// <param name="Width"></param>
    /// <param name="Height"></param>
    /// <returns></returns>
    public Byte[] LoadImageInToByteArray(string FileName, int Width, int Height)
    {
        BitmapImage bitmap = new BitmapImage();

        System.IO.FileStream photoStream = new System.IO.FileStream(FileName, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read);

        bitmap.BeginInit();
        bitmap.StreamSource = photoStream;
        bitmap.CacheOption = BitmapCacheOption.OnLoad;
        bitmap.DecodePixelHeight = Height;
        bitmap.DecodePixelWidth = Width;
        byte[] buffer = BufferFromImage(bitmap);
        bitmap.EndInit();
        return buffer;
    }

    /// <summary>
    /// Convert BitImage into Byte Array.
    /// </summary>
    /// <param name="imageSource"></param>
    /// <returns></returns>
    public Byte[] BufferFromImage(BitmapImage imageSource)
    {
        byte[] result = null;

        if (imageSource != null)
        {
            using (MemoryStream memStream = new MemoryStream())
            {
                JpegBitmapEncoder encoder = new JpegBitmapEncoder();
                encoder.Frames.Add(BitmapFrame.Create(imageSource));
                encoder.Save(memStream);

                result = memStream.ToArray();
            }

        }

        return result;
    }

这个函数被这一行调用:

yelloDataSet.EmployeesPicture[index].Picture =
    helperClass.LoadImageInToByteArray(helperClass.OpenFileDialogSingle("Abrir Imaginen."),150,150);

我在这里错过了什么?

【问题讨论】:

  • BufferFromImage() ?如果是,那么它可能没有使用新的位图宽度或高度,而是底层流正在一对一复制。
  • 尝试在BufferFromImage()之前调用EndInit()
  • 这给了我一个空的 Byte[] ...
  • 不,它以前不起作用,它返回未修改的字节流。我猜你必须打电话给EndInit()。问题是为什么字节数组是空的。你叫什么?是 null 还是 Length == 0 ?此外,您没有确认 BufferFromImage() 方法的外观(可能值得将其纳入问题)。
  • 我会将 BufferFromImage 添加到问题中。来自调试器:缓冲区 {byte[0]} byte[]

标签: c# mysql wpf image bitmap


【解决方案1】:
     public static MemoryStream ResizeImageFromStream(Stream stream, String nameOfFile, int width, int height)
{
    try
    {
        Image img;
        double ratio;
    int newWidth;
    int newHeight;      
        Graphics gfx = null;
        img = Image.FromStream(stream);
        Image Photo = new Bitmap(img, width, height);
        Encoder myEncoder;
        EncoderParameter myEncoderParameter;
        EncoderParameters myEncoderParameters;
        ImageCodecInfo myImageCodecInfo;

        myImageCodecInfo = GetEncoderInfo(nameOfFile.Substring(nameOfFile.LastIndexOf(".")).ToLower());
        myEncoder = Encoder.Quality;
        myEncoderParameters = new EncoderParameters(1);
        myEncoderParameter = new EncoderParameter(myEncoder, 87L);
        myEncoderParameters.Param[0] = myEncoderParameter;
        MemoryStream mstr = new MemoryStream();

        gfx = Graphics.FromImage(Photo);
        gfx.InterpolationMode = InterpolationMode.HighQualityBicubic;
        gfx.SmoothingMode = SmoothingMode.HighQuality;
        gfx.PixelOffsetMode = PixelOffsetMode.HighQuality;
        gfx.CompositingQuality = CompositingQuality.HighQuality;
        gfx.DrawImage(img, 0, 0, width, height);

        ImageCodecInfo[] info = ImageCodecInfo.GetImageEncoders();
        EncoderParameters encParams = new EncoderParameters(1);
        encParams.Param[0] = new EncoderParameter(Encoder.Quality, m_imageQuality);

        img.Dispose();
        Photo.Save(mstr, info[1],encParams);
        Photo.Dispose();

        return mstr;

    }
    catch
    {
        return new MemoryStream();
    }


}

您可以将内存流转换为字节

【讨论】:

  • 这在 WPF 应用程序中没有多大意义。除此之外,您可以编辑并取消删除您的其他答案,而不是编写新答案。
猜你喜欢
  • 2012-06-06
  • 1970-01-01
  • 1970-01-01
  • 2015-06-04
  • 2012-05-07
  • 1970-01-01
  • 1970-01-01
  • 2012-04-19
  • 2014-06-26
相关资源
最近更新 更多