**
DUPLICATE解决了问题
**
我现在已经抓了谷歌一段时间了,我找到了一些答案,但我无法使其发挥作用 我读到在加载/替换位图时.NET中存在内存泄漏。该框架不是autom。从旧位图释放内存。由于"内部,GC无法收集旧的位图?"引用不是autom。由框架删除。
一切正常,所以你真的不必阅读所有代码 我只是不明白在哪里释放那些烦人的记忆。
非常欢迎任何帮助。提前谢谢。
我的所作所为:
imageTif.Source = _imageManager.getBitmapSource();
public BitmapSource getBitmapSource(){
//Create Bitmap from Tif
//Create **NEW** BitmapSource using HBitmap
//returning BitmapSource
}
这是我创建位图的方法:
private Bitmap tiffToBitmap()
{
FieldValue[] imageHeight = _tif.GetField(TiffTag.IMAGELENGTH);
int height = imageHeight[0].ToInt();
FieldValue[] imageWidth = _tif.GetField(TiffTag.IMAGEWIDTH);
int width = imageWidth[0].ToInt();
FieldValue[] bitsPerSample = _tif.GetField(TiffTag.BITSPERSAMPLE);
short bpp = bitsPerSample[0].ToShort();
if (bpp != 1)
return null;
FieldValue[] samplesPerPixel = _tif.GetField(TiffTag.SAMPLESPERPIXEL);
short spp = samplesPerPixel[0].ToShort();
if (spp != 1)
return null;
FieldValue[] photoMetric = _tif.GetField(TiffTag.PHOTOMETRIC);
Photometric photo = (Photometric)photoMetric[0].ToInt();
if (photo != Photometric.MINISBLACK && photo != Photometric.MINISWHITE)
return null;
int stride = _tif.ScanlineSize();
Bitmap result = new Bitmap(width, height, PixelFormat.Format1bppIndexed);
// update bitmap palette according to Photometric value
bool minIsWhite = (photo == Photometric.MINISWHITE);
ColorPalette palette = result.Palette;
palette.Entries[0] = (minIsWhite ? Color.White : Color.Black);
palette.Entries[1] = (minIsWhite ? Color.Black : Color.White);
result.Palette = palette;
for (int i = 0; i < height; i++)
{
Rectangle imgRect = new Rectangle(0, i, width, 1);
BitmapData imgData = result.LockBits(imgRect, ImageLockMode.WriteOnly, PixelFormat.Format1bppIndexed);
byte[] buffer = new byte[stride];
_tif.ReadScanline(buffer, i);
Marshal.Copy(buffer, 0, imgData.Scan0, buffer.Length);
result.UnlockBits(imgData);
}
return result;
}
这是我使用HBitmap创建BitmapSource的方法:
private BitmapSource getBitmapSourceFromBitmap(Bitmap bitmap){
return System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
bitmap.GetHbitmap(),
IntPtr.Zero,
Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());
}