我是靠谱客的博主 微笑纸飞机,最近开发中收集的这篇文章主要介绍测试Bitmap和Marshal.Copy,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

 #region 测试Bitmap和Marshal.Copy
public static void TestBitmapAndMarshalCopy()
{
//测试Bitmap和Marshal.Copy
Bitmap bitmap1 = new Bitmap("./123456.jpg");
Rectangle rectangle = new Rectangle(0, 0, bitmap1.Width, bitmap1.Height);
//锁定bitmap到系统内存
System.Drawing.Imaging.BitmapData bitmapData = bitmap1.LockBits(rectangle, System.Drawing.Imaging.ImageLockMode.ReadWrite, bitmap1.PixelFormat);
//BitmapData 指定 Bitmap 的特性,如大小、像素格式、像素数据在内存中的起始地址以及每个扫描行的长度(步幅)。
var pixel = bitmapData.PixelFormat; //Bitmap 的特性 宽度
var Width = bitmapData.Width;//Bitmap 的特性 宽度
var Height = bitmapData.Height; //Bitmap 的特性 高度
var firstStartAddress = bitmapData.Scan0;//像素数据在内存中的起始地址
var Stride = bitmapData.Stride;//像素数据在内存中的每个扫描行的长度(步幅)
var leength = Math.Abs(bitmapData.Stride) * bitmapData.Height;
byte[] bts = new byte[leength];
// 将数据从非托管内存指针复制到托管 8 位无符号整数数组
System.Runtime.InteropServices.Marshal.Copy(firstStartAddress, bts, 0, bts.Length);
//使rgb图片变红色
for (int i = 2; i < bts.Length; i += 3)
{
bts[i] = 255;
}
//将数据从一维托管 8 位无符号整数数组复制到非托管内存指针。
System.Runtime.InteropServices.Marshal.Copy(bts, 0, firstStartAddress, bts.Length);
bitmap1.UnlockBits(bitmapData);
bitmap1.Save("./123456new.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
bitmap1.Dispose();
//测试托管内存到非托管内存
string a = "123456";
IntPtr dd = System.Runtime.InteropServices.Marshal.AllocHGlobal(10);
char[] chars = a.ToCharArray();
// 将数据从一维托管字符数组复制到非托管内存指针。
System.Runtime.InteropServices.Marshal.Copy(chars, 0, dd, chars.Length);
//修改
//
char[] chars1 = new char[chars.Length];
//将数据从非托管内存指针复制到托管字符数组。
System.Runtime.InteropServices.Marshal.Copy(dd, chars1, 0, chars.Length);
System.Runtime.InteropServices.Marshal.FreeHGlobal(dd);
}
#endregion

最后

以上就是微笑纸飞机为你收集整理的测试Bitmap和Marshal.Copy的全部内容,希望文章能够帮你解决测试Bitmap和Marshal.Copy所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(59)

评论列表共有 0 条评论

立即
投稿
返回
顶部