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

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

 代码中,先把字型矩阵转换为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_UNICODE
    FT_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;
}
目录
相关文章
|
9月前
|
机器学习/深度学习 定位技术 容器
百度地图高级开发:map.getDistance计算多点之间的距离并输入矩阵
百度地图高级开发:map.getDistance计算多点之间的距离并输入矩阵
157 0
|
算法 定位技术 数据安全/隐私保护
简谈百度坐标反转至WGS84的三种思路
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 基于百度地图进行数据展示是目前项目中常见场景,但是因为百度地图是基于BD09坐标系的,GPS坐标(WGS84)或者其他常见的标准坐标是无法准确在地图上进行展示的,但是互联网在线情况下,百度提供了将WGS84经纬度转换成百度经纬度坐标的API,这里不再对其进行研究(离线情况下也有专门方法解决)。
1643 0
|
3月前
|
算法 Java Go
Rust每日一练(Leetday0025) 矩阵置零、搜索二维矩阵、颜色分类
Rust每日一练(Leetday0025) 矩阵置零、搜索二维矩阵、颜色分类
34 0
Rust每日一练(Leetday0025) 矩阵置零、搜索二维矩阵、颜色分类
|
3月前
|
Go 算法 Java
Golang每日一练(leetDay0025) 矩阵置零、搜索二维矩阵、颜色分类
Golang每日一练(leetDay0025) 矩阵置零、搜索二维矩阵、颜色分类
23 0
Golang每日一练(leetDay0025) 矩阵置零、搜索二维矩阵、颜色分类
|
3月前
|
Python
python输入位置的坐标(即经纬度),计算两点的距离结果保留两位
python输入位置的坐标(即经纬度),计算两点的距离结果保留两位
C#编程练习(02):大地坐标系(LBH)向空间直角坐标系(XYZ)的转换及其逆转换
C#编程练习(02):大地坐标系(LBH)向空间直角坐标系(XYZ)的转换及其逆转换
C#编程练习(02):大地坐标系(LBH)向空间直角坐标系(XYZ)的转换及其逆转换
|
10月前
|
人工智能 JavaScript C++
蓝桥杯统计子矩阵前缀和C++(附图文超详细讲解)(保姆级)
蓝桥杯统计子矩阵前缀和C++(附图文超详细讲解)(保姆级)
|
11月前
|
机器学习/深度学习 自然语言处理 算法
【每日算法Day 93】不用额外空间,你会旋转一个矩阵吗?
【每日算法Day 93】不用额外空间,你会旋转一个矩阵吗?
|
算法
基于参考辐射源/定标的校正算法(二)
两点定标算法较一点定标在效果上有了较大的提高,并且依然有着较低的算法复杂度。因此,其在红外探测器的工程生产中被大量使用。两点定标算法同一点定标算法的原理基本相同,只是通过两个定标点来计算校正参数。
138 0
基于参考辐射源/定标的校正算法(二)