自己根据qrencode的源码导了一个dll动态库,见:

自己希望能用C#语言调用以下。
首先构建需要的对象:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct QrCodeLL
{ public int version; ///< version of the symbol
public int width;
public int size;///< width of the symbol
public IntPtr data; ///< symbol data }
接口:
[DllImport("LLQrencode.dll", EntryPoint = "OutPutQrCodeCSharp", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr OutPutQrCodeCSharp(byte[] bts);//接收参数对应 unsigned char* 也就是二维码内容

使用方法:

     public Form1()
{
InitializeComponent();
}
string str = "https://www.cnblogs.com/HelloQLQ/p/16289395.html";
private void button1_Click(object sender, EventArgs e)
{
var byts = Encoding.UTF8.GetBytes(str); IntPtr ptr = IntPtr.Zero;
var i = TestLL.OutPutQrCodeCSharp(byts);
var qCode = Marshal.PtrToStructure<QrCodeLL>(i); int size = qCode.width * qCode.width + qCode.width - 1;
byte[] managedArray = new byte[size];
Marshal.Copy(qCode.data, managedArray, 0, size); var arr = getPngArr(managedArray, qCode.width);
var img = GetMap(arr, qCode.width); picBox.Image = Magnifier(img, 4);
picBox.Refresh();
} public byte[] getPngArr(byte[] data, int width)
{
byte[] arr = new byte[data.Length]; int m = 0;
for (int y = 0; y < width; y++)
{
for (int x = 0; x < width; x++)
{
if ((data[y * width + x] & 0x01) == 1)
{
arr[m++] = 0;
}
else
{
arr[m++] = 1;
}
}
}
return arr;
} public Bitmap GetMap(byte[] arr, int w)
{
Bitmap map = new Bitmap(w, w); for (int i = 0; i < w; i++)
{
for (int j = 0; j < w; j++)
{
if (arr[i * w + j] == 1)
map.SetPixel(i, j, Color.White);
else
{
map.SetPixel(i, j, Color.Black);
}
}
}
return map;
} public Bitmap Magnifier(Bitmap srcbitmap, int multiple)
{
if (multiple <= 0) { multiple = 0; return srcbitmap; }
Bitmap bitmap = new Bitmap(srcbitmap.Size.Width * multiple, srcbitmap.Size.Height * multiple);
BitmapData srcbitmapdata = srcbitmap.LockBits(new Rectangle(new Point(0, 0), srcbitmap.Size), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
BitmapData bitmapdata = bitmap.LockBits(new Rectangle(new Point(0, 0), bitmap.Size), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
unsafe
{
byte* srcbyte = (byte*)(srcbitmapdata.Scan0.ToPointer());
byte* sourcebyte = (byte*)(bitmapdata.Scan0.ToPointer());
for (int y = 0; y < bitmapdata.Height; y++)
{
for (int x = 0; x < bitmapdata.Width; x++)
{
long index = (x / multiple) * 4 + (y / multiple) * srcbitmapdata.Stride;
sourcebyte[0] = srcbyte[index];
sourcebyte[1] = srcbyte[index + 1];
sourcebyte[2] = srcbyte[index + 2];
sourcebyte[3] = srcbyte[index + 3];
sourcebyte += 4;
}
}
}
srcbitmap.UnlockBits(srcbitmapdata);
bitmap.UnlockBits(bitmapdata);
return bitmap;
}
运行效果:
总结:
c++使用的 undesign char* 最好是作为接口的返回参数,C#端用IntPtr接收,
接收后,通过Marshal.PtrToStructure(i);转为结构体。
结构体里的指针也是对应c++里的 undesign char*,这样接收:
int size = qCode.width * qCode.width + qCode.width - 1;
byte[] managedArray = new byte[size];
Marshal.Copy(qCode.data, managedArray, 0, size);
需要注意,需要知道接收数组的大小,这里根据源码得知大小是这样算的,其他的话就需要在返回参数里给明白了。
getPngArr,是把数据转为二维码字节数组。
GetMap,原始二维码图像大小
Magnifier,方法二维码图片尺寸。网上抄的。

C# 调用 qrencode的动态库的更多相关文章

  1. 关于C#调用非托管动态库方式的性能疑问

    最近的项目中,因为一些原因,需要C#调用非托管(这里为C++)的动态库.网上喜闻乐见的方式是采用静态(DllImport)方式进行调用.偶然在园子里看到可以用动态(LoadLibrary,GetPro ...

  2. C#调用C/C++动态库 封送结构体,结构体数组

    一. 结构体的传递 #define JNAAPI extern "C" __declspec(dllexport) // C方式导出函数 typedef struct { int ...

  3. Android NDK开发及调用标准linux动态库.so文件

    源:Android NDK开发及调用标准linux动态库.so文件 预备知识及环境搭建 1.NDK(native development Kit)原生开发工具包,用来快速开发C.C++动态库,并能自动 ...

  4. linux c编程调用系统的动态库时,要使用dlopen等函数吗?

    同问 linux c编程调用系统的动态库时,要使用dlopen等函数吗? 2012-11-27 21:55 提问者: hnwlxyzhl 我来帮他解答 满意回答 2012-12-07 09:08 li ...

  5. C#调用C/C++动态库,封装各种复杂结构体

    C#调用C/C++动态库,封装各种复杂结构体. 标签: c++结构内存typedefc# 2014-07-05 12:10 6571人阅读 评论(1) 收藏 举报  分类: C(8)  C#(6)  ...

  6. cpp调用c的动态库

    目录 cpp调用c的动态库 title: cpp调用c的动态库 date: 2019/11/22 20:34:29 toc: true --- cpp调用c的动态库 CPP文件里这么引用头文件即可 e ...

  7. C# 调用其他的动态库开发应注意的问题

    1.背景 程序开发语言可以说是五花八门,这就引出了一个新问题 ,不同语言开发的系统进行对接时相关调用的问题. 下面我主要说一下我自己在做接口开发时遇到的问题及解决方法仅供参考,我使用的C#开发进行对接 ...

  8. C#调用C/C++动态库 封送结构体,结构体数组

    因为实验室图像处理的算法都是在OpenCV下写的,还有就是导航的算法也是用C++写的,然后界面部分要求在C#下写,所以不管是Socket通信,还是调用OpenCV的DLL模块,都设计到了C#和C++数 ...

  9. 浙江省“一卡通”异地就医,C#调用省一卡通动态库

    前言,最近学习调用 浙江省一卡通业务,主要就是调用一个DLL,动态库文件,这个动态库是浙大网新研发的. 借着自学的机会把心得体会都记录下来,方便感兴趣的小伙伴学习与讨论. 内容均系原创,欢迎大家转载分 ...

  10. 关于Android NDK中调用第三方的动态库

    因为最近在整合Android 上RTSP播放器的网络库,因需要调用自己编译的网络库,调用一直出现问题,开始时是直接在Android.mk 中加入LOCAL_SHARED_LIBRARIES := li ...

随机推荐

  1. 你真会判断DataGuard的延迟吗?

    这是一个比较细节的知识点,但必须要理解这个才能准确判断Oracle ADG的延迟情况. 以前做运维工作时,记得是要同时重点关注v$dataguard_stats视图中的几个字段的值,分别是:NAME. ...

  2. Ansible 学习笔记 - 批量巡检站点 URL 状态

    前言 不拖泥带水,不东拉西扯. 速战速决,五分钟学到一个工作用得上的技巧. 通过一个个具体的实战案例,来生动演示 Ansible 的用法. 需求 我需要定期巡检或定时监控我公司的所有站点的首页的可用性 ...

  3. CentOS7环境saltstack安装配置

    一.安装epel yum源 yum -y install epel-release yum clean all yum makecache 二.安装 saltstack-master 并配置 1.安装 ...

  4. 基于openstack安装部署私有云详细图文教程

    本文主要分享的是云计算.openstack的使用.私有云平台建设.云服务器云硬盘的构建和使用.从基本概念入手到私有云建设,信息量非常大.对于openstack的安装部署都是从官方文档中一步步的介绍,内 ...

  5. docker 应用篇————nginx 例子[六]

    前言 简单整理一下nginx 例子. 正文 拉取nginx 镜像. docker pull nginx 那么会拉取nginx:latest 这个. 如果需要其他的,可以去官网查询一下. 2.docke ...

  6. 重新整理 .net core 实践篇—————应用分层[二十四]

    前言 简单整理一下分层. 正文 应用程序分层,分为: 1.领域模型层 2.基础设施层 3.应用层 4.共享层 共享层 共享层一般包括下面几个类库. 有一个Core 的类库,比如说BLog.Core. ...

  7. MySQL组合索引

    MySQL组引合索优化SQL 我的场景 200w左右的数据,后面会更多 使用定时任务爬取数据插入到自己的数据库.要保证数据的唯一性,所以我用了组合唯一索引. 表结构 最初的组合索引 SQL执行和exp ...

  8. MQTT实战系列(一)——MQTT简介

    随着移动互联网以及物联网应用的蓬勃发展,阿里云推出微消息队列 MQTT,从而实现端(浏览器.Android.iOS.智能设备.直播互动.车联网)与云的双向通信,通过消息实现万物互联. MQTT (Me ...

  9. 记一次WPF的DataGrid绑定数据

    之前一直在用winform,但是感觉界面不好看,然后就自己在网上学习WPF.一开始看到DataGrid的时候,还以为它是DataGridView,然后用winform的方法绑定数据发现不行,在不断的查 ...

  10. Exception in thread "main" java.util.NoSuchElementException

    Exception in thread "main" java.util.NoSuchElementException 用了两个scanner的时候,执行程序发生报错:Except ...