c#利用内存拷贝方式改变bitmap图像宽高
2021/11/26 7:10:28
本文主要是介绍c#利用内存拷贝方式改变bitmap图像宽高,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
c#内存拷贝有Marshal.Copy方法,适合托管内存和非托管内存之间的拷贝。然而图像之间的内存拷贝都位于非托管内存,想用Marshal类需要先从非托管内存复制到托管内存,最后再复制到非托管内存,效率减半。最后借助win32自带的CopyMemory方法成功实现。
[DllImport("kernel32.dll", EntryPoint = "CopyMemory")] public extern static void CopyMemory(IntPtr dst, IntPtr src, int length); /// <summary> /// 改变图像宽高 /// </summary> public static Bitmap ReSize(Bitmap src, int w, int h) { if (src == null || w < 1 || h < 1) return null;//或者抛出异常 var srcData = src.LockBits(new Rectangle(0, 0, src.Width, src.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, src.PixelFormat); var dst = new Bitmap(w, h, src.PixelFormat); var dstData = dst.LockBits(new Rectangle(0, 0, dst.Width, dst.Height), System.Drawing.Imaging.ImageLockMode.ReadWrite, dst.PixelFormat); var pSrc = srcData.Scan0; var pDst = dstData.Scan0; int wLen = w > src.Width ? srcData.Stride : dstData.Stride;//要拷贝的图像字节宽度 int hLen = h > src.Height ? src.Height : h;//要拷贝的图像高度 for (int i = 0; i <hLen; i++) { CopyMemory(pDst, pSrc, wLen); pSrc += srcData.Stride; pDst += dstData.Stride; } src.UnlockBits(srcData); dst.UnlockBits(dstData); return dst; }
这篇关于c#利用内存拷贝方式改变bitmap图像宽高的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#
- 2024-01-24Advanced .Net Debugging 1:你必须知道的调试工具
- 2024-01-24.NET集成IdGenerator生成分布式全局唯一ID
- 2024-01-23用CI/CD工具Vela部署Elasticsearch + C# 如何使用
- 2024-01-23.NET开源的简单、快速、强大的前后端分离后台权限管理系统