UI界面读取一张图片,鼠标选中一个position,计算出对应图片的像素坐标,传给c++

c++中读取图片地址,解析出*char数组,根据ARGB协议,解析出ARGB的值,传递给UI界面

在UI界面中解析ARGB值,显示对应的颜色和16进制的字符串表示

bitmap 中每个像素的ARGB内存分布

因为大小端的缘故,和我们理解的ARGB的顺序相反,大小端读者有兴趣可以深入了解,

参考:https://zhuanlan.zhihu.com/p/25119530

读取每一个像素值

像素是以char* 格式存储在内存中,是一个一位数组,bitmap中记录了每一行的长度,即步辐,每个平台都有API可以获取 一个像素对应的bitmap内存位置为:

b = y * stride + x * 4 // 计算的是b通道

g = b + 1;

r = b + 2;

a = b + 3;

详细代码如下:

int f_getPixel(unsigned char *srcData, int width, int height, int stride, int x, int y, int argb[4])

{

x = x < 0 ? 0 : (x > width - 1 ? width - 1 : x);

y = y < 0 ? 0 : (y > height - 1 ? height - 1 : y);

int ret = 0;

if(srcData == nullptr)

{

printf("input image is null!");

return -1;

}

//Process

int pos = x * 4 + y * stride;

argb[0] = srcData[pos + 3];

argb[1] = srcData[pos + 2];

argb[2] = srcData[pos + 1];

argb[3] = srcData[pos + 0];

return ret;

}

实现颜色选择

这里基于qml来处理,读者有兴趣迁移到Android/iOS也不复杂

1. 获取鼠标点击坐标对应的图片像素坐标,传递给C++,这里简单处理,图片平铺到Image中

var pox = (mouseX / 640) *imageViewer.sourceSize.width;

var poy = (mouseY / 480) * imageViewer.sourceSize.height;

console.log("pox = ", pox, "poy = ", poy);

processor.getPix(fileDialog.fileUrl, pox, poy);

2.C++中解析Bitmap,注意url是file:///协议,qml中可以识别,C++中不能直接识别,需要处理下;Qt中C++与qml传参有限制,这里需要传递数组,用QVariantList->转场QVariant;最后发送信号

void ImageProcessor::getPix(QString sourceFile, int x, int y)

{

const QUrl url(sourceFile);

if (url.isLocalFile()) {

sourceFile = QDir::toNativeSeparators(url.toLocalFile());

}

QImage image(sourceFile);

if(image.isNull())

{

return;

}

unsigned char *data = image.bits();

int w = image.width();

int h = image.height();

int stride = image.bytesPerLine();

int argb[4];

f_getPixel(data, w, h, stride, x, y, argb);

QVariantList list;

list<

emit getPixDone(QVariant::fromValue(list));

}

qml中接收信号,展示结果。注意js中数据的长度有限

ImageProcessor {

function rgba(a,r,g,b){

var ret = (r << 16 | g << 8 | b);

var strRet = ("#" + a.toString(16) + ret.toString(16)).toUpperCase();

return strRet;

}

id: processor;

onFinished: {

imageViewer.source = "file:///" +newFile;

}

onGetPixDone: {

var selectColor = rgba(list[0], list[1],list[2],list[3]);

position.color = selectColor;

positionTex.text = selectColor;

}

}

android bitmap大小端,1. 解析Bitmap的ARGB,实现图片颜色选择器相关推荐

  1. 计算机存储的大小端模式解析

    ---------------------------------------------------------------------------------------------------- ...

  2. java大小端字节流解析_记录一个如何解决java与C++socket通信的大小端问题

    问题背景 oracle jdk默认的socket通信发送int类型数据高位优先.下面是jdk包内部相关源码.(模拟) os.write((len >>> 24) & 0xFF ...

  3. android 访问web,android 访问web端与解析json,模拟用户登录

    之前写过一个java web端的登录验证,最后返回一个json字符串. 字符串格式如下:{"appmsg":"账号或密码错误","appcode&qu ...

  4. CPU大小端模式对C语言底层开发的影响

    CPU大小端模式对C语言底层开发的影响 ​ 在嵌入式的c语言底层开发过程中,经常会遇到CPU大小端模式的问题,对底层软件的数据结构构建.数据解析.甚至功能实现上均有一定的影响,我自己在ECU的底层软件 ...

  5. Android之 颜色选择器

    一,简介 1.1 计算机的颜色通常有两种表示方式: 光源模式RGB(Red=红, Green=绿, Blue=蓝),数值0-255 印刷模式CMYK(Cyan=青, Magenta=品红, Yello ...

  6. 【Android】二进制图片和Bitmap的getPixel方法解析

    Android中Bitmap的getPixel方法解析 第一次写博客,一直想动笔,但是感觉想写的东西网上都有很详细的了...今天终于下定决心,写第一篇博客.感觉博客这个东西,别人的和自己的是不一样的, ...

  7. Android -- 重置Bitmap大小Bitmap转角度

    重置Bitmap大小                                                                           Bitmap bitMap = ...

  8. Android:安卓学习笔记之Bitmap的简单理解和使用

    Android Bitmap的简单理解和使用 Android Bitmap 一.Bitmap的定义 二.Bitmap的格式 2.1 存储格式 2.2 压缩格式 三.Bitmap创建方法 3.1 Bit ...

  9. 【Android 内存优化】Bitmap 硬盘缓存 ( Google 官方 Bitmap 示例 | DiskLruCache 开源库 | 代码示例 )

    文章目录 一.Google 官方 Bitmap 相关示例参考 二.磁盘缓存类 DiskLruCache 三.磁盘缓存初始化 四.存储数据到磁盘缓存中 五.从磁盘缓存中读取数据 六. Android 1 ...

最新文章

  1. 【源码】Word转PDF V1.0.1 小软件,供新手参考
  2. php面向对象分页,PHP基于面向对象封装的分页类示例
  3. C4.5最新版本Release8与MDL的关系的详细解读
  4. Ubuntu 16.04+.Net Core+Docker+Nginx安装部署
  5. Spark SQL 编程API入门系列之SparkSQL数据源
  6. 操作系统期末总复习(题库)
  7. sql loader
  8. 浅层砂过滤器 全自动浅层介质过滤系统
  9. 数控电机反馈线是哪根_驱动?电机?反馈?和人身体动作一样!十图看懂数控机床进给驱动...
  10. 用JSON-server模拟REST API(二) 动态数据
  11. Java如何得到时间格式dd-MMM-yy???
  12. AOP切面之实现计算器加减乘除--基于注解的方式
  13. Grafana-创建仪表板的Best实践
  14. CSS3元素闪烁效果
  15. word/ppt 中怎么在数字字母上面加横线、波浪线、箭头等符号
  16. 3天(从策划到上线传播)获客10w+| 小程序拉新活动范例
  17. GPRS模块中AT指令发送短信的PDU编码规则
  18. 9个可视化图表在线制作工具,总有一款适合你
  19. linux_bash/zsh ls(dircolor)_文件夹背景颜色去除(绿色背景)(fit to wsl)(simple solution)
  20. 直播软件打开测试频道,对比评测:看地方台,这三个直播软件不要错过

热门文章

  1. 看懂了一点傅里叶变换的原理
  2. DL基本知识(五)神经网络经典模型
  3. mbbiDirect记录
  4. LeetCode Top-100
  5. 甲骨文业绩超预期股价大涨近11% 市值首超2000亿美元
  6. 健身运动装备有哪些?双十一运动健身装备选购指南
  7. 解答:为什么判断一个数是否为素数时只需开平方根就行了!
  8. 关于充电电池(AA型和AAA型)
  9. 知乎高赞:35岁失业的程序员,最后都去了哪儿?是在路边摊炒粉和做烤鸭?...
  10. vue.js 默认选中select_vue select二级联动第二级默认选中第一个option值的实例