缩放图片算法优化 sse

前情提要
这里实现了打印文件的缩放算法 缩放打印文件(prt,prn)
核心功能如下:

void CZoomPrtFile::zoomPrtFile(BYTE* pTargetData)
{float xRatio = static_cast<float>(m_perWidth - 1) / m_zoomWidth;float yRatio = static_cast<float>(m_perHeight - 1) / m_zoomHeight;int srcX=0, srcY=0;int nTargetLineSize = (m_zoomWidth * m_header.nImageColorDeep + 7) / 8;BYTE* pSourceLineData = new BYTE[m_header.nBytePerLine];for (size_t row = 0; row < m_zoomHeight; row++) {srcY = static_cast<int>(yRatio * row);for (int ColorNum = 0; ColorNum < m_header.nImageColorNum; ColorNum++){memset(pSourceLineData, 0, m_header.nBytePerLine);ReadLine(pSourceLineData, srcY * m_header.nImageColorNum + ColorNum, 0, m_header.nBytePerLine);for (size_t column = 0; column < m_zoomWidth; column++) {srcX = static_cast<int>(xRatio * column);// 获取源图像的 bit像素值unsigned char srcValue = getPixel(pSourceLineData, srcX, m_header.nImageColorDeep);int y = (row * m_header.nImageColorNum + ColorNum) * nTargetLineSize + sizeof(m_header);// 设置目标图像的2bit像素值setPixel(pTargetData+y,column, srcValue, m_header.nImageColorDeep);}}}delete[] pSourceLineData;
}unsigned char CZoomPrtFile::getPixel(unsigned char* data, int x, int nImageColorDeep)
{//unsigned char存储 8/int nImageColorDeep 个 int nImageColorDeep bit像素 ,其中 nImageColorDeep :1,2,4,8 RIP image output bit per colorint byteIndex = x * nImageColorDeep / 8; // 字节索引int bitIndex = (x * nImageColorDeep) % 8; // 位索引// 创建掩码unsigned char mask = (1 << nImageColorDeep) - 1;//std::lock_guard<std::mutex> locker(fileMutex);// 位运算提取像素unsigned char pixel;{ std::lock_guard<std::mutex> locker(fileMutex); pixel = data[byteIndex];}pixel = (pixel >> bitIndex) & mask;return pixel;
}unsigned char CZoomPrtFile::getPixel(unsigned char data, int x, int nImageColorDeep)
{//unsigned char存储 8/int nImageColorDeep 个 int nImageColorDeep bit像素 ,其中 nImageColorDeep :1,2,4,8 RIP image output bit per colorint byteIndex = x * nImageColorDeep / 8; // 字节索引int bitIndex = (x * nImageColorDeep) % 8; // 位索引// 创建掩码unsigned char mask = (1 << nImageColorDeep) - 1;//std::lock_guard<std::mutex> locker(fileMutex);// 位运算提取像素unsigned char pixel = (data >> bitIndex) & mask;return pixel;
}

使用sse 128

void CZoomPrtFile::zoomPrtFileSSE128(BYTE* pTargetData)
{const float xRatio = static_cast<float>(m_perWidth - 1) / m_zoomWidth;const float yRatio = static_cast<float>(m_perHeight - 1) / m_zoomHeight;__m128 xmmRatio = _mm_set1_ps(xRatio);__m128 ymmRatio = _mm_set1_ps(yRatio);__m128i colorDeep = _mm_set1_epi32(m_header.nImageColorDeep);__m128i bitMask = _mm_set1_epi8(0x07);unsigned char mask = (1 << m_header.nImageColorNum) - 1;__m128i mmMask = _mm_set1_epi32(mask); BYTE* pSourceLineData = new BYTE[m_header.nBytePerLine];int nTargetLineSize = (m_zoomWidth * m_header.nImageColorDeep + 7) / 8;for (int row = 0; row < m_zoomHeight; row++){int srcY = static_cast<int>(yRatio * row);for (int ColorNum = 0; ColorNum < m_header.nImageColorNum; ColorNum++){memset(pSourceLineData, 0, m_header.nBytePerLine);ReadLine(pSourceLineData, srcY * m_header.nImageColorNum + ColorNum, 0, m_header.nBytePerLine);for (int column = 0; column < m_zoomWidth; column+=4){// 加载128位值。返回值代表寄存器的变量中的相同值,地址p不需要16字节对齐。__m128i xmmColumn = _mm_setr_epi32(column, column + 1, column + 2, column + 3);// 列索引转换为浮点数__m128 xmmColumnF = _mm_cvtepi32_ps(xmmColumn);// 乘以缩放比例  转换为整数__m128i xmmSrcXInt = _mm_cvttps_epi32(_mm_mul_ps(xmmColumnF, xmmRatio));//原图xmmSrcXInt = _mm_mullo_epi32(xmmSrcXInt, colorDeep);// 方法1:右移三位实现除以8__m128i xmmSrcXByteIndex = _mm_srli_epi32(xmmSrcXInt, 3);// 字节索引__m128i xmmSrcXBitIndex = _mm_and_si128(xmmSrcXInt, bitMask);// 位索引//目标图__m128i xmmDesX = _mm_mullo_epi32(xmmColumn, colorDeep);//位索引 __m128i xmmDesXByteIndex = _mm_srli_epi32(xmmDesX, 3);// 字节索引__m128i xmmDesXBitIndex = _mm_and_si128(xmmDesX, bitMask);// 位索引//源数据alignas(16) int srcXByteIndex[4];//_mm_store_si128((__m128i*)srcXByteIndex, xmmSrcXByteIndex);alignas(16) int srcXBitIndex[4];//_mm_store_si128((__m128i*)srcXBitIndex, xmmSrcXBitIndex);unsigned char pixel[4]{ (pSourceLineData[srcXByteIndex[0]] >> srcXBitIndex[0])& mask,(pSourceLineData[srcXByteIndex[1]] >> srcXBitIndex[1])& mask,(pSourceLineData[srcXByteIndex[2]] >> srcXBitIndex[2])& mask,(pSourceLineData[srcXByteIndex[3]] >> srcXBitIndex[3])& mask};//目标数据int y = (row * m_header.nImageColorNum + ColorNum) * nTargetLineSize + sizeof(m_header);BYTE* desDataPointer = pTargetData + y;alignas(16) int DesXByteIndex[4];_mm_store_si128((__m128i*)DesXByteIndex, xmmDesXByteIndex);alignas(16) int DesXBitIndex[4];//_mm_store_si128((__m128i*)DesXBitIndex, xmmDesXBitIndex);desDataPointer[DesXByteIndex[0]] = (desDataPointer[DesXByteIndex[0]] & ~(mask << DesXBitIndex[0])) |((pixel[0] /*& mask*/ ) << DesXBitIndex[0]);desDataPointer[DesXByteIndex[1]] = (desDataPointer[DesXByteIndex[1]] & ~(mask << DesXBitIndex[1])) |((pixel[1] /*& mask*/) << DesXBitIndex[1]);desDataPointer[DesXByteIndex[2]] = (desDataPointer[DesXByteIndex[2]] & ~(mask << DesXBitIndex[2])) |((pixel[2] /*& mask*/) << DesXBitIndex[2]);desDataPointer[DesXByteIndex[3]] = (desDataPointer[DesXByteIndex[3]] & ~(mask << DesXBitIndex[3])) |((pixel[3] /*& mask*/) << DesXBitIndex[3]);}}}}

本来提取像素和设置像素都应该用sse写的,但是折磨了chatgpt好几天 也没有写出来。
所以这里仅用sse优化 源数据以及目标数据坐标的计算
即使是这样优化效果也很好
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/144968.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenHarmony应用开发入门教程(一、开篇)

前言 华为正式宣布2024年发布的华为鸿蒙OS Next版将不再兼容安卓系统。这一重大改变&#xff0c;预示着华为鸿蒙OS即将进入一个全新的阶段。 都说科技无国界&#xff0c;这是骗人的鬼话。谷歌的安卓12.0系统早已发布&#xff0c;但是自从受到美影响&#xff0c;谷歌就拒绝再向…

网络安全(大厂面试真题集)

前言 随着国家政策的扶持&#xff0c;网络安全行业也越来越为大众所熟知&#xff0c;想要进入到网络安全行业的人也越来越多。 为了拿到心仪的 Offer 之外&#xff0c;除了学好网络安全知识以外&#xff0c;还要应对好企业的面试。 作为一个安全老鸟&#xff0c;工作这么多年…

android studio导入eclipse项目

网上下载一个老工程&#xff0c;.project文件里有eclipse。 android studio导入eclipse项目 eclipse项目结构 Android studio文件结构 下面是导入步骤&#xff1a; 第一步&#xff0c;打开一个项目。 选择File->New->Import Project 第二步&#xff0c;选择Eclipse项目根…

如何设计开发一对一交友App吸引更多活跃用户

在当今社交媒体时代&#xff0c;一对一交友App开发正日渐成为发展热点。如何吸引更多活跃用户成为开发者们的首要任务。通过本文&#xff0c;我们将探讨一系列方法&#xff0c;助您设计开发一对一交友App&#xff0c;吸引更多用户的关注和参与&#xff0c;提升App的活跃度。 了…

elementplus DateTimePicker 日期范围选择器 设置默认时间范围为当前月的起始时间到结束时间

代码如下&#xff1a; <el-date-pickerv-model"value"type"datetimerange"start-placeholder"Start Date"end-placeholder"End Date":default-time"defaultTime" />const defaultTime: [Date, Date] [new Date(2000…

小米手环8pro重新和手机配对解决办法

如果更换了手机&#xff0c;那么小米手环8pro是无法和新手机自动连接的。 但是在新手机上直接连接又连接不上&#xff0c;搜索蓝牙根本找不到手环的蓝牙。 解决办法就是&#xff1a; 把手环恢复出厂&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 是的&…

服务器数据恢复—服务器raid5离线磁盘上线同步失败的数据恢复案例

服务器数据恢复环境&故障&#xff1a; 某品牌DL380服务器中有一组由三块SAS硬盘组建的RAID5阵列。数据库存放在D分区&#xff0c;数据库备份存放在E分区。 服务器上有一块硬盘的状态灯显示红色&#xff0c;D分区无法识别&#xff0c;E分区可识别&#xff0c;但是拷贝文件报…

Node.js详解

一、是什么 Node.js 是一个开源与跨平台的 JavaScript 运行时环境 在浏览器外运行 V8 JavaScript 引擎&#xff08;Google Chrome 的内核&#xff09;&#xff0c;利用事件驱动、非阻塞和异步输入输出模型等技术提高性能 可以理解为 Node.js 就是一个服务器端的、非阻塞式I/…

【XTDrone Ubuntu20.04】XTDrone+ Ubuntu20.04 + PX4安装

XTDrone仿真平台配置 文章目录 XTDrone仿真平台配置依赖安装 ROS一键安装Marvos安装PX4 安装安装QTGroundControlXTDrone下载安装 环境&#xff1a; VMWare 16.0 Ubuntu 22.04 &#xff08;因为没人配过&#xff09;Ubuntu 20.04 参考文章&#xff1a; 仿真平台基础配置 (yuq…

Qt QWebSocket实现JS调用C++

目录 前言1、QWebChannel如何与网页通信2、QWebSocketQWebChannel与网页通信2.1 WebSocketTransport2.2 WebSocketClientWrapper2.3 初始化WebSocket服务器2.4 前端网页代码修改 总结 前言 本篇主要介绍实现JS调用C的另一种方式&#xff0c;即QWebSocketQWebChannel。与之前的…

RabbitMQ之消息应答和持久化

文章目录 前言一、消息应答1.概念2.自动应答3.消息应答方法4.Multiple 的解释5.消息自动重新入队6.消息手动应答代码7.手动应答效果演示 二、RabbitMQ持久化1.概念2.队列如何实现持久化3.消息实现持久化4.不公平分发5.预取值 总结 前言 在RabbitMQ中&#xff0c;我们的消费者在…

SQL题

[极客大挑战 2019]EasySQL 进行简单的尝试&#xff0c;就知道是单引号的字符型注入 万能密码进行一个简单的尝试 结果就出来了 还是要了解一下原理 输入的是1&#xff0c;形成的sql语句是错误的SELECT*FROM table_name WHERE username1and password123; 第一个单引号和第二个…

01Urllib

1.什么是互联网爬虫&#xff1f; 如果我们把互联网比作一张大的蜘蛛网&#xff0c;那一台计算机上的数据便是蜘蛛网上的一个猎物&#xff0c;而爬虫程序就是一只小蜘蛛&#xff0c;沿着蜘蛛网抓取自己想要的数据 解释1&#xff1a;通过一个程序&#xff0c;根据Url(http://www.…

Flutter应用-使用sqflite升级数据库

文章目录 问题描述具体做法代码示例更多条件限制升级 数据库迁移和备份简介数据库迁移数据库备份 问题描述 使用fluttter开发的应用程序发布后&#xff0c;发现数据库有些设计不合理。如何来更新数据库呢&#xff1f; 使用sqflite来处理数据库&#xff0c;但是第一版软件发布后…

JQuery ajax 提交数据提示:Uncaught TypeError:Illegal invocation

JQuery ajax 提交数据提示&#xff1a;Uncaught TypeError:Illegal invocation 1 问题描述 用jQuery Ajax向DRF接口提交数据的时候&#xff0c;console提示&#xff1a;Uncaught TypeError:Illegal invocation(未捕获的异常&#xff1a;非法调用)。 这个问题可能有两种原因导…

Zookeeper学习笔记(1)—— 基础知识

Zookeeper概述 Zookeeper 是一个开源的分布式的&#xff0c;为分布式框架提供协调服务的 Apache 项目 工作机制 Zookeeper从设计模式角度来理解&#xff1a;是一个基于观察者模式设计的分布式服务管理框架&#xff0c;它负责存储和管理大家都关心的数据&#xff0c;然后接受…

【AI视野·今日Robot 机器人论文速览 第六十三期】Thu, 26 Oct 2023

AI视野今日CS.Robotics 机器人学论文速览 Fri, 27 Oct 2023 Totally 27 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers 6-DoF Stability Field via Diffusion Models Authors Takuma Yoneda, Tianchong Jiang, Gregory Shakhnarovich, Matthew R. …

微软Surface/Surface pro笔记本电脑进入bios界面

微软Surface笔记本电脑进入bios界面 方法一推薦這種方法&#xff1a;Surface laptop 进BIOS步骤 开机后&#xff0c;不停按音量键进bios界面。 方法二&#xff1a;Surface Book、Surface Pro进bios步骤 1、关闭Surface&#xff0c;然后等待大约10秒钟以确保其处于关闭状态。…

SQL中的数据类型和规范化,助力数据存储优化

大家好&#xff0c;目前优化数据存储对于获得良好的性能始终至关重要&#xff0c;选择合适的数据类型并应用正确的规范化过程对于决定其性能至关重要。本文将介绍最重要和最常用的数据类型和规范化过程。 一、SQL中的数据类型 SQL中主要有两种数据类型&#xff1a;字符串和数…

小程序action-sheet结合自定义tabbar显示

要实现此效果&#xff0c;遇到的问题&#xff1a;背景在电脑端调试的情况正常的情况下&#xff0c;手机端点击事件工单&#xff0c;返回回来的时候action-sheet卡住在屏幕上&#xff0c;点击遮罩层都不消失。更奇怪的是 这种情况并不是每次发生&#xff0c;而是有时候发生&…