Имейте в виду, что независимо от сценария причина всегда одинакова в .NET:
Вы пытаетесь использовать ссылочную переменную, значение которой
Nothing
/null
. Если для ссылочной переменной значениеNothing
/null
, это означает, что на самом деле оно не содержит ссылку на экземпляр любого объекта, который существует в куче.Вы либо никогда не присваивали какую-либо переменную, никогда не создавали экземпляр значения, присвоенного переменной, или вы вручную устанавливали переменную, равную
blockquote>Nothing
/null
, или вы вызывали функцию, которая установите для этой переменной значениеNothing
/null
.
Можно обойтись без использования небезопасного кода с помощью Bitmap.LockBits
и скопировать пиксели с BitmapSource
прямо на Bitmap
Bitmap GetBitmap(BitmapSource source) {
Bitmap bmp = new Bitmap(
source.PixelWidth,
source.PixelHeight,
PixelFormat.Format32bppPArgb);
BitmapData data = bmp.LockBits(
new Rectangle(Point.Empty, bmp.Size),
ImageLockMode.WriteOnly,
PixelFormat.Format32bppPArgb);
source.CopyPixels(
Int32Rect.Empty,
data.Scan0,
data.Height * data.Stride,
data.Stride);
bmp.UnlockBits(data);
return bmp;
}
Это то, что вы ищете?
Bitmap bmp = System.Drawing.Image.FromHbitmap(pBits);
Вы можете делиться пиксельными координатами между обоими пространствами имен. Вам не нужно преобразовывать.
Использовать SharedBitmapSource. https://stackoverflow.com/a/32841840/690656
Вы можете просто использовать эти два метода:
public static BitmapSource ConvertBitmap(Bitmap source)
{
return System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
source.GetHbitmap(),
IntPtr.Zero,
Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());
}
public static Bitmap BitmapFromSource(BitmapSource bitmapsource)
{
Bitmap bitmap;
using (var outStream = new MemoryStream())
{
BitmapEncoder enc = new BmpBitmapEncoder();
enc.Frames.Add(BitmapFrame.Create(bitmapsource));
enc.Save(outStream);
bitmap = new Bitmap(outStream);
}
return bitmap;
}
Он отлично работает для меня.
ConvertBitmap()
утечка памяти. См. этот ответ для аналогичной альтернативы, которой нет.
– Mateen Ulhaq
15 April 2016 в 19:00
Это аккуратно и быстрее света:
return Imaging.CreateBitmapSourceFromHBitmap( bitmap.GetHbitmap(), IntPtr.Zero,
Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions() );
Здесь приведен код для установки прозрачного фона для любого растрового ресурса в словаре ресурсов (не Resource.resx, часто используемого в возрасте Windows.Forms). Я называю этот метод перед InitializeComponent () - методу. Методы «ConvertBitmap (источник битмапа)» и «BitmapFromSource» (битмапсурс источника BitmapSource) упоминаются в сообщении от melvas выше.
private void SetBitmapResourcesTransparent()
{
Image img;
BitmapSource bmpSource;
System.Drawing.Bitmap bmp;
foreach (ResourceDictionary resdict in Application.Current.Resources.MergedDictionaries)
{
foreach (DictionaryEntry dictEntry in resdict)
{
// search for bitmap resource
if ((img = dictEntry.Value as Image) is Image
&& (bmpSource = img.Source as BitmapSource) is BitmapSource
&& (bmp = BitmapFromSource(bmpSource)) != null)
{
// make bitmap transparent and assign it back to ressource
bmp.MakeTransparent(System.Drawing.Color.Magenta);
bmpSource = ConvertBitmap(bmp);
img.Source = bmpSource;
}
}
}
}
Windows.Media
иSystem.Drawing.Imaging
, этот PixelFormat должен быть специально записан какSystem.Drawing.Imaging.PixelFormat
. То же самое сSystem.Drawing.Point
. – Nyerguds 21 August 2016 в 14:34