Bitmap构造函数为何不保留帧信息?有无更优处理方案?
问题解答
一、Bitmap构造函数为何不保留多帧信息?
Bitmap类的设计定位是单帧光栅图像容器,当你通过new Bitmap(Image)构造函数创建对象时,它只会复制源Image中当前激活的那一页帧的像素数据与属性,并不会保留源图像的多帧集合、元数据这类信息。
GDI+中Image.FromFile针对多页TIFF返回的是支持多帧的Image子类实例,而Bitmap本质仅承载单帧图像,所以调用GetFrameCount只会返回1,自然无法访问后续页面。
二、无需创建新对象访问全部帧的最优方式
根本不需要创建新的Bitmap或Image对象,直接使用Image.FromFile返回的原始对象即可完整访问所有帧:
/* 返回结果如下... Page:1 W/H: 7650/9900 Page:2 W/H: 3600/2025 Page:3 W/H: 3600/2025 */ using (Image img = Image.FromFile(imagePath)) { int pageCount = img.GetFrameCount(FrameDimension.Page); for (int i = 0; i < pageCount; i++) { img.SelectActiveFrame(FrameDimension.Page, i); Debug.WriteLine($"Page:{i + 1} W/H: {img.Width}/{img.Height}"); } }
你之前用Clone的方式可行,但完全没必要——Clone只是创建了与源对象一致的副本,而源对象本身就具备访问所有帧的能力,直接操作它即可,既节省内存,也避免不必要的对象创建开销。
如果后续需要对某一帧进行修改操作,再单独复制该帧到新的Bitmap中即可,无需复制整个多帧图像。
内容的提问来源于stack exchange,提问作者Arvo Bowen
相关产品推荐
相关产品推荐

