c# - filestream.seek和marshal.copy期间的内存使用情况

时间:2017-02-05 11:16:26

标签: c# memory bitmap marshalling filestream

我有一个正在运行的代码,它可以获取任何文件类型,并在一个充满黑白像素的图片框中显示该文件,表示打开的文件位

////////////////         
int bmpWidth = 128000;
int startIndex = 0;      
Int64 tempz = Convert.ToInt64(bmpWidth);
long tmp2 = fs.Length / tempz + 1;
int bmpHeight = Convert.ToInt32(tmp2);
Bitmap bmp = new Bitmap(bmpWidth, bmpHeight, PixelFormat.Format1bppIndexed);
////////////////
long all = 0;
byte[] array = new byte[bmpWidth];
int read = 0;

fs.Seek(startIndex, SeekOrigin.Begin);
all += startIndex;

BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, bmp.PixelFormat);
Int64 ptrFirstPixel = bmpData.Scan0.ToInt64();
int y = 0;
while ((read = fs.Read(array, 0, array.Length)) > 0)
{ 
    if (read < array.Length)
    {
        byte[] arrayNew = new byte[read];
        Array.Copy(array, arrayNew, read);
        array = arrayNew;
    }
    Marshal.Copy(array, 0, new IntPtr(ptrFirstPixel + y * bmpData.Stride), array.Length/8);
    y++;
    all += read;
}
bmp.UnlockBits(bmpData);       
imageBox.Image = bmp;
  • 我有一个4GB内存,我打开一个4.5GB的文件怎么可能?
  • 而且,当我尝试打开2或4 GB文件时,只使用200MB内存,其余数据来自哪里?
  • 在marshal.copy和filestream.seek期间,系统使用内存逐字节地存储空洞文件流和位图或来自硬盘?

我心中有逻辑和语义上的误解,任何帮助!?

0 个答案:

没有答案