public virtual long CopyTo(InteropValues.IStream pstm, long cb, long[] pcbRead) { const int bufsize = 4096; var buffer = Marshal.AllocHGlobal(bufsize); if (buffer == IntPtr.Zero) { throw new OutOfMemoryException(); } long written = 0; try { while (written < cb) { var toRead = bufsize; if (written + toRead > cb) { toRead = (int)(cb - written); } var read = Read(buffer, toRead); if (read == 0) { break; } if (pstm.Write(buffer, read) != read) { throw EFail("Wrote an incorrect number of bytes"); } written += read; } } finally { Marshal.FreeHGlobal(buffer); } if (pcbRead != null && pcbRead.Length > 0) { pcbRead[0] = written; } return(written); }
internal static extern int GdipSaveImageToStream(HandleRef image, InteropValues.IStream stream, ref Guid classId, HandleRef encoderParams);
internal static extern int GdipCreateBitmapFromStream(InteropValues.IStream stream, out IntPtr bitmap);