代码中,先把字型矩阵转换为bit,再进行旋转。关键有几点:

  • 计算数组大小。
size = (w+7) * (h+7) / 8;
  • 正确旋转的算法。这个通过byte旋转代码得到。参考:

https://quantum6.blog.csdn.net/article/details/110794038

  • bit坐标转换。代码是这样的:
            int srcPos     = (offset + x);int srcPosByte = srcPos / 8;int srcPosBit  = srcPos % 8;int value = (pBuffer[srcPosByte] & (0x01 << srcPosBit)) != 0 ? 1 : 0;int dstPosByte = i / 8;int dstPosBite = i % 8;pRotated[dstPosByte] |= (value << dstPosBite);

全部源码:

  看到这么整齐的源码,肯定是本人所写。如此漂亮,阁下应该学习初中。

#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>#include <ft2build.h>
#include <freetype/freetype.h>
#include FT_FREETYPE_H#define FONT_FILE "/home/uos/font/simsun.ttc"static void dumpByte(char* pBuffer, int w, int h)
{int i=0;int j=0;//printf("w=%d, h=%d\n", w, h);for (i=0; i<h; i++){printf("|");for (j=0; j<w; j++){printf((pBuffer[i * w  + j]) ? "1" : " ");}printf("|\n");}
}static void dumpFontBmp(FT_Bitmap* pBmp)
{int w = pBmp->width;int h = pBmp->rows;dumpByte(pBmp->buffer, w, h);
}static char* byteToBit(char* pBuffer, int w, int h)
{int i=0;int j=0;int size = (w+7) * (h+7) / 8;char* bits = (char*)malloc(size);memset(bits, 0, size);for (i=0; i<h; i++){for (j=0; j<w; j++){int srcPos     = (i * w  + j);int srcPosByte = srcPos / 8;int srcPosBit  = srcPos % 8;bits[srcPosByte] |= (pBuffer[i * w  + j] == 0 ? 0 : (0x01 << srcPosBit));}}return bits;
}static void dumpBit(char* pBuffer, int w, int h)
{int i=0;int j=0;printf("w=%d, h=%d\n", w, h);for (i=0; i<h; i++){printf("|");for (j=0; j<w; j++){int srcPos   = (i * w  + j);int posByte  = srcPos / 8;int posBit   = srcPos % 8;int bitValue = (pBuffer[posByte] & (0x01 << posBit)) != 0 ? 1 : 0;printf(bitValue ? "1" : " ");}printf("|\n");}
}static char* rotate_90(char* pBuffer, int w, int h)
{int i=0;char* pRotated;int size;int offset=0;size = (w+7) * (h+7) / 8;pRotated = (char*)malloc(size);memset(pRotated, 0, size);int startPos = (h - 1) * w;i = 0;for (int x = 0; x < w; x++){int offset = startPos;for (int y = h - 1; y >= 0; y--){int srcPos      = (offset + x);int srcPosByte  = srcPos / 8;int srcPosBit   = srcPos % 8;int srcBitValue = (pBuffer[srcPosByte] & (0x01 << srcPosBit)) != 0 ? 1 : 0;int dstPosByte  = (i)/8;int dstPosBit   = (i)%8;pRotated[dstPosByte] |= (srcBitValue << dstPosBit);i++;offset -= w;}}dumpBit(pRotated, h, w);return pRotated;
}static char* rotate_270(char* pBuffer, int w, int h)
{int i=0;char* pRotated;int size;int offset=0;size = (w+7) * (h+7)/8;pRotated = (char*)malloc(size);memset(pRotated, 0, size);i = 0;for (int x = w-1; x >= 0; x--){int offset = 0;for (int y = 0; y < h; y++){int srcPos      = (offset + x);int srcPosByte  = srcPos / 8;int srcPosBit   = srcPos % 8;int srcBitValue = (pBuffer[srcPosByte] & (0x01 << srcPosBit)) != 0 ? 1 : 0;int dstPosByte  = i / 8;int dstPosBit   = i % 8;pRotated[dstPosByte] |= (srcBitValue << dstPosBit);i++;offset += w;}}dumpBit(pRotated, h, w);return pRotated;
}int main()
{FT_Library  m_pFTLib;FT_Face     m_pFTFace;wchar_t chinese_char = L'泰';FT_Error result = FT_Init_FreeType(&m_pFTLib);if(FT_New_Face(m_pFTLib, FONT_FILE, 0, &m_pFTFace)){printf("FT_New_Face error!\n");return -1;}//FT_ENCODING_GB2312, FT_ENCODING_UNICODEFT_Select_Charmap(m_pFTFace, FT_ENCODING_UNICODE);FT_Set_Char_Size(m_pFTFace, 0, 12<<6, 200, 200);result = FT_Load_Glyph(m_pFTFace, FT_Get_Char_Index(m_pFTFace, chinese_char), FT_LOAD_DEFAULT);// 第二个参数为渲染模式result = FT_Render_Glyph(m_pFTFace->glyph,  FT_RENDER_MODE_NORMAL);  printf("result=%d\n", result);FT_Bitmap* pBmp = &(m_pFTFace->glyph->bitmap);//dumpFontBmp(pBmp);int w = pBmp->width;int h = pBmp->rows;char* bits = byteToBit(m_pFTFace->glyph->bitmap.buffer, w, h);dumpBit(bits, w, h);rotate_90( bits, w, h);rotate_270(bits, w, h);return 0;
}

全网首发:以字型为例,以bit表示的二维数组矩阵,旋转90、-90相关推荐

  1. java二维数组添加数据_我敢保证,全网没有再比这更详细的Java知识点总结了,送你啊...

    接下来你看到的将是全网最详细的Java知识点总结,全文分为三大部分:Java基础.Java框架.Java+云数据 小编将为大家仔细讲解每大部分里面的详细知识点,别眨眼,从小白到大佬.零基础到精通,你 ...

  2. Java 中的一维数组以及二维数组(8千字零基础超全详解)

    文章目录 前言 一.一维数组 1. 数组的初始化 1.1 动态初始化一 1.2 动态初始化二 1.3 静态初始化 2. 数组使用的注意事项和细节 3. 经典例题 4. 数组赋值机制(重难点!) 5. ...

  3. ACMNO.24 C语言-转置矩阵 写一个函数,使给定的一个二维数组(3×3)转置,即行列互换。 输入 一个3x3的矩阵 输出 转置后的矩阵 样例

    题目描述 写一个函数,使给定的一个二维数组(3×3)转置,即行列互换. 输入 一个3x3的矩阵 输出 转置后的矩阵 样例输入 1 2 3 4 5 6 7 8 9 样例输出 1 4 7 2 5 8 3 ...

  4. java---编写一个方法,返回一个int型的二维数组,数组中的元素通过解析字符串参数获得。

    题目: 编写一个方法,返回一个int型的二维数组,数组中的元素通过解析字符串参数获得,字符串如下"1,2:3,4,5:6,7"对应的数组为: d[0][0]=1 d[0][1]=2 ...

  5. Java黑皮书课后题第8章:*8.27(列排序)用下面的方法实现一个二维数组中的列排序。返回新数组,且原数组保持不变。编写一个测试程序,提示用户输入一个3*3的double型矩阵,显示一个排好的矩阵

    *8.27(列排序)用下面的方法实现一个二维数组中的列排序.返回新数组,且原数组保持不变.编写一个测试程序,提示用户输入一个3*3的double型矩阵,显示一个排好的矩阵 题目 题目描述与运行示例 破 ...

  6. Java黑皮书课后题第8章:*8.26(行排序)用下面的方法实现一个二维数组中的行排序。返回新数组,且原数组保持不变。编写一个测试程序,提示用户输入一个3*3的double型矩阵,显示一个排好的矩阵

    *8.26(行排序)用下面的方法实现一个二维数组中的行排序.返回新数组,且原数组保持不变.编写一个测试程序,提示用户输入一个3*3的double型矩阵,显示一个排好的矩阵 题目 题目描述与运行示例 破 ...

  7. 【千字过程分析】剑指 Offer 04. 二维数组中的查找

    立志用最少的代码做最高效的表达 在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数 ...

  8. C语言试题三十七之求除一个2×m整型二维数组中最大元素的值,并将此值返回调用函数。

    1. 题目 请编写一个函数function,它的功能是:求除一个2×m整型二维数组中最大元素的值,并将此值返回调用函数. 2 .温馨提示 C语言试题汇总里可用于计算机二级C语言笔试.机试.研究生复试中 ...

  9. 不懂就问--Java基本数据类型与数组(定义了int型二维数组a[6][7]后,数组元素a[3][4]前的数组元素个数)案例分析

    首先要知道java中的数组是线性排列的 其次要知道数组的初始标度为0 例如定义了一个二维数组 a[1][2],则数组详细为 [0][0]: [0][1]: [0][2]: [1][0]: [1][1] ...

  10. C语言 一维数组叠加为二维数组样例

    这里参看memcpy的用法,将一个一维整型数组不停的叠加为二维数组 使用宏定义来控制二维数组的行列 代码如下: #include <stdio.h> #include <stdlib ...

最新文章

  1. Linux tree命令
  2. Varnish页面缓存服务
  3. C语言 printf格式化输出,参数详解
  4. 在linux下赋予000权限,【linux】对于文件权限的理解
  5. 翻译练习:计算机网络
  6. python报数组越界_【问题汇总】列表数组越界的问题
  7. iframe并没有错
  8. ExecutorService的shutDown和shutDownNow方法的区别
  9. 与JavaWeb有关的故事(Web请求与Java IO)
  10. 开关电源(DC/DC)和线性电源(LDO低压差线性稳压器)的区别
  11. python发送以太网报文_python之分解以太帧
  12. coursera和udacity_从Udacity和Coursera进行深度学习
  13. scrapy_redis分布式爬虫遇到的问题DEBUG: Filtered offsite request to
  14. 2. 查询表product——统计所有库存商品的总价值
  15. [深度学习项目] - 时间序列预测 (5)[待补充]
  16. 给王凌打Call的,原来是神奇的智能湖仓
  17. 烤仔星选·NFT实验室 | 展望2021:是否是NFT爆发元年?
  18. 小米软件研发工程师面试
  19. linux 系统日常管理
  20. springboot的精髓

热门文章

  1. VMware虚拟机Centos7配置双网卡双IP踩坑
  2. antd 轮播图样式_antd-design 的轮播图组件Carousel如何在初始化的时候自动跳转到特定图片...
  3. 各地实时摄像头_你头顶的摄像头将变成有脑子的眼睛!亚马逊推出AWS Panorama,强监控时代来临?...
  4. java不规则数组杨辉,JAVASE课程 第一章 第三讲程序控制与数组
  5. 动静结合 APT防护需建立整体应对体系
  6. json-lib解析json之二维JSONArray
  7. java.lang.ClassNotFoundException: net.sf.json.JSONObject
  8. android 实现类似微信缓存和即时更新好友头像
  9. 基于PhalApi的Redis拓展
  10. ionic的弹出框---和$ionicModal