将JPG,PNG图像转为ktx2
根据官方网站 GitHub - KhronosGroup/KTX-Software: KTX (Khronos Texture) Library and Tools
ktx2库依赖了一堆奇奇怪怪得汇编等东西, 不适合封装成跨平台得库, 遂自行将源码抽出封装成库, 先说其他图片转为ktx2得流程:
首先将jpg或者png等其他格式用相应得库读成内存像素;
再选择ktx2得编码范式: 主要有两种可选:(Basis和Astc) 其中(Basis内又分为使用 uastc与否)
具体调用选ETC1S或者 uastc使用ktxTexture2_CompressBasisEx
选astc使用ktxTexture2_CompressAstcEx
最后是否用zstd压缩(Basis不使用uastc将zstd调用失败),输出成文件;
调用代码如下:
ktxTexture* ktx2; //ktx_error_code_e err;ktx_error_code_e result;ktxTextureCreateInfo createInfo;//createInfo.glInternalformat = 32856;//GL_RGB8; // Ignored if creating a ktxTexture2.createInfo.vkFormat = ToKtx2VkFormat(img->RGBAType());//VK_FORMAT_R8G8B8_UNORM; // Ignored if creating a ktxTexture1.createInfo.baseWidth = img->Width();createInfo.baseHeight = img->Height();createInfo.baseDepth = 1;createInfo.numDimensions = 2;createInfo.numLevels = 1;//log2(max_dim) + 1;createInfo.numLayers = 1;createInfo.numFaces = 1;createInfo.isArray = KTX_FALSE;createInfo.generateMipmaps = KTX_FALSE;result = ktxTexture2_Create(&createInfo, ktxTextureCreateStorageEnum::KTX_TEXTURE_CREATE_ALLOC_STORAGE, (ktxTexture2**)&ktx2);result = ktxTexture_SetImageFromMemory(ktx2, 0, 0, 0, (ktx_uint8_t*)img->Bit(), ktx2->dataSize);if (KTX_SUCCESS != result){GS_E << " failed to create ktxTexture2; " << ktxErrorString(result);return false;}int threadcount = std::thread::hardware_concurrency() / 4;if (threadcount <= 0)threadcount = 1;if (1 >= m_CompressType){ktxBasisParams params = {};params.structSize = sizeof(params);params.threadCount = threadcount;params.uastc = m_CompressType;//0 默认ETC1S/BLZ 1 uastcparams.compressionLevel = KTX_ETC1S_DEFAULT_COMPRESSION_LEVEL;params.qualityLevel = m_QualityLevel;result = ktxTexture2_CompressBasisEx((ktxTexture2*)ktx2, ¶ms);// ktx_uint32_t(m_QualityLevel / 12));}else{ktxAstcParams params{};params.structSize = sizeof(params);params.threadCount = threadcount;params.blockDimension = KTX_PACK_ASTC_BLOCK_DIMENSION_6x6;params.mode = KTX_PACK_ASTC_ENCODER_MODE_LDR;params.qualityLevel = KTX_PACK_ASTC_QUALITY_LEVEL_MEDIUM;params.normalMap = false;if (m_QualityLevel >= KTX_PACK_ASTC_QUALITY_LEVEL_FASTEST)params.qualityLevel = KTX_PACK_ASTC_QUALITY_LEVEL_FASTEST;if (m_QualityLevel >= KTX_PACK_ASTC_QUALITY_LEVEL_FAST)params.qualityLevel = KTX_PACK_ASTC_QUALITY_LEVEL_FAST;if (m_QualityLevel >= KTX_PACK_ASTC_QUALITY_LEVEL_MEDIUM)params.qualityLevel = KTX_PACK_ASTC_QUALITY_LEVEL_MEDIUM;if (m_QualityLevel >= KTX_PACK_ASTC_QUALITY_LEVEL_THOROUGH)params.qualityLevel = KTX_PACK_ASTC_QUALITY_LEVEL_THOROUGH;if (m_QualityLevel >= KTX_PACK_ASTC_QUALITY_LEVEL_EXHAUSTIVE)params.qualityLevel = KTX_PACK_ASTC_QUALITY_LEVEL_EXHAUSTIVE;result = ktxTexture2_CompressAstcEx((ktxTexture2*)ktx2, ¶ms);}if (m_DeflateUseZstd){result = ktxTexture2_DeflateZstd((ktxTexture2*)ktx2, ktx_uint32_t(m_QualityLevel / 12));}if (KTX_SUCCESS != result){GS_E << " failed to deFlate ktxTexture2; " << ktxErrorString(result);return false;}if (m_Buffer) {m_Buffer->Allocate(0);ktx_uint8_t* pHead = nullptr;ktx_size_t size =0;ktxTexture_WriteToMemory(ktx2, &pHead, &size);m_Buffer->Append(pHead, size);}else {ktxTexture_WriteToNamedFile(ktx2, m_file.c_str());}return true;
做了多年开发, 但是图像解析库各有千秋, 特别是设计到三维得图片纹理编解码其实乱得很,遂将所有库整理为一套库,供大家使用, 图像编解码库封装库(PNG,JPG,WEBP,KTX1和2,tif,SVG) 基本上所有常见类型得库都可以支持, 但是没有封装统一操作, 可以直接嵌入代码即可.
KTX2标准定义:
KTX File Format Specification
KTX相关资料:
3D-Formats-Guidelines/KTXArtistGuide.md at main · KhronosGroup/3D-Formats-Guidelines · GitHub
https://github.com/KhronosGroup/DataFormat
GitHub - KhronosGroup/KTX-Software: KTX (Khronos Texture) Library and Tools
将JPG,PNG图像转为ktx2相关推荐
- 彩色RGB图像转为灰度图像
将彩色RGB图像转为灰度图像,其中像素值的转换为 灰度值=0.2989 * R + 0.5870 * G + 0.1140 * B 原彩色RGB图像是三通道的,转换成单通道的灰度图像 自己写了一个Py ...
- python输出jpg_利用python实现.dcm格式图像转为.jpg格式
如下所示: import pydicom import matplotlib.pyplot as plt import scipy.misc import pandas as pd import nu ...
- python bmp转jpg_利用python实现.dcm格式图像转为.jpg格式
如下所示: import pydicom import matplotlib.pyplot as plt import scipy.misc import pandas as pd import nu ...
- 将图像转为特征值_用K均值进行图像分割
个人学习笔记:采用聚类方法对图像进行分割,以下内容纯粹个人理解,如有错误请帮我指出!多谢! 图像分割就是把图像按照某些条件分成不同的区域,并提取出感兴趣的区域.传统的分割方法包括基于阈值的分割.基于区 ...
- python图片保存jpg、show变成bmp_利用python实现.dcm格式图像转为.jpg格式
如下所示: import pydicom import matplotlib.pyplot as plt import scipy.misc import pandas as pd import nu ...
- 用python将.dcm格式图像转为.jpg格式
用python将.dcm格式图像转为.jpg格式 import pydicom import matplotlib.pyplot as plt import scipy.misc import pan ...
- 如何将深度学习的float32图像转为Unit8格式以方便cv2使用
在使用Pyside2中的 QImage处理深度学习模型生成的图片时,需要将float32的图像转为Unit8格式,再使用cv2处理. 一开始使用网上的其他教程,如下: # 模型生成G_recon = ...
- 使用TensorFlow进行常用的图像处理-图像转为矩阵以及图像大小调整
图像编码处理 将图像转为一个三维矩阵,并使用三维矩阵形成一个图像: import tensorflow as tf import matplotlib.pyplot as plt# 读取原始图像数据 ...
- 使用GDAL将12bit量化图像转为16bit或者8bit
很多遥感卫星数据使用的量化级别都要比8bit高,比如常用的WorldView用的是12bit的量化,对于一些图像处理软件,是不能直接处理12bit量化的图像,所以需要将12bit的数据转为16bit数 ...
最新文章
- 旷视砸20亿进军AIoT,发布国内首个机器人协作大脑河图
- MyEclipse快捷键大全(绝对全)
- 23万小鹏P7,到底够不够格PK国产特斯拉
- linux c 复制拷贝文件
- torch 特征对齐
- shell实例第8讲:seq命令
- BeanFactory笔记
- python list 去重_Python中对列表list去重
- Windows进程与线程学习笔记(四)—— 等待链表调度链表
- css 旋转45_CSS教程——第14期
- Java中常量定义在interface和class的区别(转)
- 命令行参数的作用_Rasa 聊天机器人专栏(二):命令行界面
- 抗菌药物敏感性检测仪行业调研报告 - 市场现状分析与发展前景预测
- NickLee UI中间件 for asp.net 2.0版本
- ndk-build生成.so
- NYOJ77 - 开灯问题
- 网管工具之cacti
- Nitrux安装JDK-10(Linux通用)教程
- Cocos--开启物理
- Spring Data ElasticSearch analyzer 定义 @Filed失效 @Mapping失效 创建索引 无效 解决办法 ElasticsearchRestTemplate