Tag: bitmapsource

为什么这个位图图像在加载后会改变它的大小?

快速提问: 我有这个1000 x 1000位图图像: 我用这个例程来加载它: private BitmapSource initialBitmap = new BitmapImage(new Uri(“C:\\Users\\…\\Desktop\\Original.bmp”)); 为什么在我加载之后,在我跨过上面的线后,我看到它是800 x 800 ? PS我希望它是1000 x 1000并且不使用任何Resize函数。 它工作,突然它是800 * 800!

DPI在BitmapSource.Create()方法中的相关性是什么?

我阅读了有关DPI的维基百科文章,但它让我更加困惑……我没有关于图像的任何DPI信息。 我应该使用什么DPI与BitmapSource.Create() ,使用常量(96/72?)是否可以,如果我不打算打印图像真的很重要吗?

如何读取BitmapSource四个角的像素?

我有一个.NET BitmapSource对象。 我想读取位图角落的四个像素,并测试它们是否都比白色更暗。 我怎样才能做到这一点? 编辑:我不介意将此对象转换为具有更好API的其他类型。

使用BitmapSource,PngBitmapEncoder / Decoder时,在PNG中保存8位索引数据会改变原始字节

使用BitmapSource和PngBitmapEncoder / Decoder保存和加载PNG时遇到问题。 基本上,我希望能够保存一个源自字节数组的图像,当PNG加载到我的程序中时,重新加载完全相同的字节。 原始数据保存很重要。 同时,我希望PNG使用自定义调色板(256色的索引数组)。 我正在尝试使用自定义索引调色板保存我的8位数据。 原始数据范围为0-255。 调色板可以是“阈值”调色板(例如,0-20是颜色#1,21-50是颜色#2,等等)。 我发现的是,当我保存数据,重新加载并执行CopyPixels以检索“原始”数据时,数据值是根据调色板设置的,而不是原始字节数组值。 有没有办法在PNG中保留原始字节数组, 而不会丢失自定义调色板? 或者有没有不同的方法从BitmapSource检索字节数组? 以下是我的保存例程: // This gets me a custom palette that is an array of 256 colors List colors = PaletteToolsWPF.TranslatePalette(this, false, true); BitmapPalette myPalette = new BitmapPalette(colors); // This retrieves my byte data as an array of dimensions _stride * sizeY byte[] ldata […]

从BitmapSource复制到WritableBitmap

我试图将BitmapSource的一部分复制到WritableBitmap。 到目前为止这是我的代码: var bmp = image.Source as BitmapSource; var row = new WriteableBitmap(bmp.PixelWidth, bottom – top, bmp.DpiX, bmp.DpiY, bmp.Format, bmp.Palette); row.Lock(); bmp.CopyPixels(new Int32Rect(top, 0, bmp.PixelWidth, bottom – top), row.BackBuffer, row.PixelHeight * row.BackBufferStride, row.BackBufferStride); row.AddDirtyRect(new Int32Rect(0, 0, row.PixelWidth, row.PixelHeight)); row.Unlock(); 我得到“ArgumentException:值不在预期的范围内。” 在CopyPixels行中。 我尝试用row.PixelHeight * row.PixelWidth交换row.PixelHeight * row.BackBufferStride ,但后来我得到一个错误,说该值太低了。 我找不到使用CopyPixels这个重载的单个代码示例,所以我正在寻求帮助。 谢谢!

InteropBitmap到BitmapImage

我正在尝试将Bitmap (SystemIcons.Question)转换为BitmapImage以便我可以在WPF图像控件中使用它。 我有以下方法将其转换为BitmapSource ,但它返回一个InteropBitmapImage ,现在的问题是如何将其转换为BitmapImage 。 直接演员似乎不起作用。 有谁知道怎么做? 码: public BitmapSource ConvertToBitmapSource() { int width = SystemIcons.Question.Width; int height = SystemIcons.Question.Height; object a = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(SystemIcons.Question.ToBitmap().GetHbitmap(), IntPtr.Zero, System.Windows.Int32Rect.Empty, BitmapSizeOptions.FromWidthAndHeight(width, height)); return (BitmapSource)a; } 返回BitmapImage的属性:(绑定到我的图像控件) public BitmapImage QuestionIcon { get { return (BitmapImage)ConvertToBitmapSource(); } }

使用C#加载内存泄漏的图像

我的应用程序中存在内存泄漏问题,它会加载大量图像。 我对C#很陌生,并认为我的内存泄漏问题已经过去了。 我无法弄清楚问题 – 也许我正在使用一些我无法正确处理的非托管模块? 为了说明我的问题,我简化了导致问题的核心,并将其转移到一个干净的项目中。 请注意,这都是愚蠢的代码,不能反映它来自的原始应用程序。 在测试应用程序中,我有2个按钮,触发两个事件。 按钮1 – 创建:将对象设置为datacontext。 这将通过将对象设置为DataContext来加载图像并使它们保持活动状态: var imgPath = @”C:\some_fixed_path\img.jpg”; DataContext = new SillyImageLoader(imgPath); 按钮2 – 清理:我的理解是,如果我放开持有SillyImageLoader并再次保存图像的引用,那么这将被删除。 我还明确地触发垃圾收集,只是为了在删除引用后立即查看内存量。 DataContext = null; System.GC.Collect(); 测试时我正在加载一个974KB的jpeg图像。 保持30位图表示可以将我的应用程序的内存使用量从大约18MB增加到大约562MB。 好。 但是当我清理时,内存只下降到~292MB。 如果我重复Create + CleanUp,我还剩下另外250MB内存。 所以显然有人仍然持有某种东西。 这是SillyImageLoader代码: namespace MemoryLeakTest { using System; using System.Drawing; using System.Windows; using System.Windows.Interop; using System.Windows.Media.Imaging; public class SillyImageLoader { private […]

C#WPF BitmapSource内存泄漏?

我正在开发一个BlackJack程序,它显示了BlackJack表,卡片等。计划是它将通过自动化策略一个接一个地玩数千手牌。 我有一个PlayerSeat UserControl,它包含一个绑定到ObservableCollection的ItemsControl。 这个CardInHand类包含一个名为CardImage的BitmapSource。 当实例被装箱时,它使用以下代码从资源加载卡片图像: [System.Runtime.InteropServices.DllImport(“gdi32.dll”)] public static extern bool DeleteObject(IntPtr hObject); private BitmapSource GenerateCardImage() { Stream TempStream = this.GetType().Assembly.GetManifestResourceStream(“BlackJack.Resources.CardImages.Card_” + m_Card.ShortTitle + “.gif”); System.Drawing.Bitmap sourceBMP = new System.Drawing.Bitmap(TempStream); BitmapSource tempBitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap( sourceBMP.GetHbitmap(), IntPtr.Zero, System.Windows.Int32Rect.Empty, BitmapSizeOptions.FromWidthAndHeight(sourceBMP.Width, sourceBMP.Height) ); TempStream.Dispose(); DeleteObject(sourceBMP.GetHbitmap()); return tempBitmapSource; } 问题是,在我运行~500轮(~4000手或~10000卡)后,我最终得到了GDI +错误,应用程序占用了大约400MB的RAM。 这种情况迅速增长,并且与已经玩过的牌数有关。 DeleteObject()是我在另一个站点上发现的,它说这是从Bitmap释放资源的最佳方式。 它可能会产生一些小影响,但不是我正在寻找的东西。 我也尝试过Dispose()。 另一个网站说它与ItemsSource绑定有关。 我删除了绑定,内存仍然增长。 反过来,我离开了绑定并删除了生成位图的代码。 它打了4万发子弹并且没有大幅度增长(在运行的40分钟内可能+ 20MB)。 […]

BitmapSource到BitmapImage

我需要将Clipboard.GetImage() ( BitmapSource )的内容解析为BitmapImage 。 有谁知道怎么做?

为什么BitmapSource.Create会抛出ArgumentException?

我试图通过使用Image和BitmapSource从WPF中显示原始数据创建的位图: Int32[] data = new Int32[RenderHeight * RenderWidth]; for (Int32 i = 0; i < RenderHeight; i++) { for (Int32 j = 0; j < RenderWidth; j++) { Int32 index = j + (i * RenderHeight); if (i + j % 2 == 0) data[index] = 0xFF0000; else data[index] = 0x00FF00; } } BitmapSource source […]