20250808 C++ 不使用三方庫,在 RGB 圖像上打印信息

先看效果

在這里插入圖片描述

直接上代碼

// *********************************************
// FileName: text_overlay.hpp
// Brief:
//
// Date:   8 Aug. 2025
// Author: ...
// *********************************************#ifndef TEXT_OVERLAY_HPP
#define TEXT_OVERLAY_HPP#include <cstdint>
#include <algorithm>
#include <cstdio>
#include <cstring>namespace OVERLAY {
enum class PixFmt { YUV_NV12, RGB24 };/* ---------- 1. 8×8 字模表(ASCII) ---------- */
// https://github.com/dhepper/font8x8
const uint8_t font8x8_ib8x8u[224][8] = {// ---------------------------  0-127 ---------------------------{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0000 (uni0000.dup1){0x7e, 0x81, 0xa5, 0x81, 0xbd, 0x99, 0x81, 0x7e},  // 0001 (uni0001){0x7e, 0xff, 0xdb, 0xff, 0xc3, 0xe7, 0xff, 0x7e},  // 0002 (uni0002){0x6c, 0xfe, 0xfe, 0xfe, 0x7c, 0x38, 0x10, 0x00},  // 0003 (uni0003){0x10, 0x38, 0x7c, 0xfe, 0x7c, 0x38, 0x10, 0x00},  // 0004 (uni0004){0x38, 0x7c, 0x38, 0xfe, 0xfe, 0x7c, 0x38, 0x7c},  // 0005 (uni0005){0x10, 0x10, 0x38, 0x7c, 0xfe, 0x7c, 0x38, 0x7c},  // 0006 (uni0006){0x00, 0x00, 0x18, 0x3c, 0x3c, 0x18, 0x00, 0x00},  // 0007 (uni0007){0xff, 0xff, 0xe7, 0xc3, 0xc3, 0xe7, 0xff, 0xff},  // 0008 (uni0008){0x00, 0x3c, 0x66, 0x42, 0x42, 0x66, 0x3c, 0x00},  // 0009 (uni0009){0xff, 0xc3, 0x99, 0xbd, 0xbd, 0x99, 0xc3, 0xff},  // 000a (uni000A){0x0f, 0x07, 0x0f, 0x7d, 0xcc, 0xcc, 0xcc, 0x78},  // 000b (uni000B){0x3c, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x18},  // 000c (uni000C){0x3f, 0x33, 0x3f, 0x30, 0x30, 0x70, 0xf0, 0xe0},  // 000d (uni000D){0x7f, 0x63, 0x7f, 0x63, 0x63, 0x67, 0xe6, 0xc0},  // 000e (uni000E){0x99, 0x5a, 0x3c, 0xe7, 0xe7, 0x3c, 0x5a, 0x99},  // 000f (uni000F){0x80, 0xe0, 0xf8, 0xfe, 0xf8, 0xe0, 0x80, 0x00},  // 0010 (uni0010){0x02, 0x0e, 0x3e, 0xfe, 0x3e, 0x0e, 0x02, 0x00},  // 0011 (uni0011){0x18, 0x3c, 0x7e, 0x18, 0x18, 0x7e, 0x3c, 0x18},  // 0012 (uni0012){0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x00},  // 0013 (uni0013){0x7f, 0xdb, 0xdb, 0x7b, 0x1b, 0x1b, 0x1b, 0x00},  // 0014 (uni0014){0x3e, 0x63, 0x38, 0x6c, 0x6c, 0x38, 0xcc, 0x78},  // 0015 (uni0015){0x00, 0x00, 0x00, 0x00, 0x7e, 0x7e, 0x7e, 0x00},  // 0016 (uni0016){0x18, 0x3c, 0x7e, 0x18, 0x7e, 0x3c, 0x18, 0xff},  // 0017 (uni0017){0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x00},  // 0018 (uni0018){0x18, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x00},  // 0019 (uni0019){0x00, 0x18, 0x0c, 0xfe, 0x0c, 0x18, 0x00, 0x00},  // 001a (uni001A){0x00, 0x30, 0x60, 0xfe, 0x60, 0x30, 0x00, 0x00},  // 001b (uni001B){0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xfe, 0x00, 0x00},  // 001c (uni001C){0x00, 0x24, 0x66, 0xff, 0x66, 0x24, 0x00, 0x00},  // 001d (uni001D){0x00, 0x18, 0x3c, 0x7e, 0xff, 0xff, 0x00, 0x00},  // 001e (uni001E){0x00, 0xff, 0xff, 0x7e, 0x3c, 0x18, 0x00, 0x00},  // 001f (uni001F){0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0020 (space){0x30, 0x78, 0x78, 0x30, 0x30, 0x00, 0x30, 0x00},  // 0021 (exclam){0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0022 (quotedbl){0x6c, 0x6c, 0xfe, 0x6c, 0xfe, 0x6c, 0x6c, 0x00},  // 0023 (numbersign){0x30, 0x7c, 0xc0, 0x78, 0x0c, 0xf8, 0x30, 0x00},  // 0024 (dollar){0x00, 0xc6, 0xcc, 0x18, 0x30, 0x66, 0xc6, 0x00},  // 0025 (percent){0x38, 0x6c, 0x38, 0x76, 0xdc, 0xcc, 0x76, 0x00},  // 0026 (ampersand){0x60, 0x60, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0027 (quotesingle){0x18, 0x30, 0x60, 0x60, 0x60, 0x30, 0x18, 0x00},  // 0028 (parenleft){0x60, 0x30, 0x18, 0x18, 0x18, 0x30, 0x60, 0x00},  // 0029 (parenright){0x00, 0x66, 0x3c, 0xff, 0x3c, 0x66, 0x00, 0x00},  // 002a (asterisk){0x00, 0x30, 0x30, 0xfc, 0x30, 0x30, 0x00, 0x00},  // 002b (plus){0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x60},  // 002c (comma){0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00},  // 002d (hyphen){0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00},  // 002e (period){0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x80, 0x00},  // 002f (slash){0x7c, 0xc6, 0xce, 0xde, 0xf6, 0xe6, 0x7c, 0x00},  // 0030 (zero){0x30, 0x70, 0x30, 0x30, 0x30, 0x30, 0xfc, 0x00},  // 0031 (one){0x78, 0xcc, 0x0c, 0x38, 0x60, 0xc4, 0xfc, 0x00},  // 0032 (two){0x78, 0xcc, 0x0c, 0x38, 0x0c, 0xcc, 0x78, 0x00},  // 0033 (three){0x1c, 0x3c, 0x6c, 0xcc, 0xfe, 0x0c, 0x1e, 0x00},  // 0034 (four){0xfc, 0xc0, 0xf8, 0x0c, 0x0c, 0xcc, 0x78, 0x00},  // 0035 (five){0x38, 0x60, 0xc0, 0xf8, 0xcc, 0xcc, 0x78, 0x00},  // 0036 (six){0xfc, 0xcc, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x00},  // 0037 (seven){0x78, 0xcc, 0xcc, 0x78, 0xcc, 0xcc, 0x78, 0x00},  // 0038 (eight){0x78, 0xcc, 0xcc, 0x7c, 0x0c, 0x18, 0x70, 0x00},  // 0039 (nine){0x00, 0x30, 0x30, 0x00, 0x00, 0x30, 0x30, 0x00},  // 003a (colon){0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x60, 0x00},  // 003b (semicolon){0x18, 0x30, 0x60, 0xc0, 0x60, 0x30, 0x18, 0x00},  // 003c (less){0x00, 0x00, 0xfc, 0x00, 0x00, 0xfc, 0x00, 0x00},  // 003d (equal){0x60, 0x30, 0x18, 0x0c, 0x18, 0x30, 0x60, 0x00},  // 003e (greater){0x78, 0xcc, 0x0c, 0x18, 0x30, 0x00, 0x30, 0x00},  // 003f (question){0x7c, 0xc6, 0xde, 0xde, 0xde, 0xc0, 0x78, 0x00},  // 0040 (at){0x30, 0x78, 0xcc, 0xcc, 0xfc, 0xcc, 0xcc, 0x00},  // 0041 (A){0xfc, 0x66, 0x66, 0x7c, 0x66, 0x66, 0xfc, 0x00},  // 0042 (B){0x3c, 0x66, 0xc0, 0xc0, 0xc0, 0x66, 0x3c, 0x00},  // 0043 (C){0xf8, 0x6c, 0x66, 0x66, 0x66, 0x6c, 0xf8, 0x00},  // 0044 (D){0xfe, 0x62, 0x68, 0x78, 0x68, 0x62, 0xfe, 0x00},  // 0045 (E){0xfe, 0x62, 0x68, 0x78, 0x68, 0x60, 0xf0, 0x00},  // 0046 (F){0x3c, 0x66, 0xc0, 0xc0, 0xce, 0x66, 0x3e, 0x00},  // 0047 (G){0xcc, 0xcc, 0xcc, 0xfc, 0xcc, 0xcc, 0xcc, 0x00},  // 0048 (H){0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00},  // 0049 (I){0x1e, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0x78, 0x00},  // 004a (J){0xe6, 0x66, 0x6c, 0x78, 0x6c, 0x66, 0xe6, 0x00},  // 004b (K){0xf0, 0x60, 0x60, 0x60, 0x62, 0x66, 0xfe, 0x00},  // 004c (L){0xc6, 0xee, 0xfe, 0xfe, 0xd6, 0xc6, 0xc6, 0x00},  // 004d (M){0xc6, 0xe6, 0xf6, 0xde, 0xce, 0xc6, 0xc6, 0x00},  // 004e (N){0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0x6c, 0x38, 0x00},  // 004f (O){0xfc, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xf0, 0x00},  // 0050 (P){0x78, 0xcc, 0xcc, 0xcc, 0xdc, 0x78, 0x1c, 0x00},  // 0051 (Q){0xfc, 0x66, 0x66, 0x7c, 0x6c, 0x66, 0xe6, 0x00},  // 0052 (R){0x78, 0xcc, 0xe0, 0x70, 0x1c, 0xcc, 0x78, 0x00},  // 0053 (S){0xfc, 0xb4, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00},  // 0054 (T){0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xfc, 0x00},  // 0055 (U){0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x30, 0x00},  // 0056 (V){0xc6, 0xc6, 0xc6, 0xd6, 0xfe, 0xee, 0xc6, 0x00},  // 0057 (W){0xc6, 0xc6, 0x6c, 0x38, 0x38, 0x6c, 0xc6, 0x00},  // 0058 (X){0xcc, 0xcc, 0xcc, 0x78, 0x30, 0x30, 0x78, 0x00},  // 0059 (Y){0xfe, 0xc6, 0x8c, 0x18, 0x32, 0x66, 0xfe, 0x00},  // 005a (Z){0x78, 0x60, 0x60, 0x60, 0x60, 0x60, 0x78, 0x00},  // 005b (bracketleft){0xc0, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x02, 0x00},  // 005c (backslash){0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x78, 0x00},  // 005d (bracketright){0x10, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00},  // 005e (asciicircum){0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff},  // 005f (underscore){0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00},  // 0060 (grave){0x00, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0x76, 0x00},  // 0061 (a){0xe0, 0x60, 0x60, 0x7c, 0x66, 0x66, 0xdc, 0x00},  // 0062 (b){0x00, 0x00, 0x78, 0xcc, 0xc0, 0xcc, 0x78, 0x00},  // 0063 (c){0x1c, 0x0c, 0x0c, 0x7c, 0xcc, 0xcc, 0x76, 0x00},  // 0064 (d){0x00, 0x00, 0x78, 0xcc, 0xfc, 0xc0, 0x78, 0x00},  // 0065 (e){0x38, 0x6c, 0x60, 0xf0, 0x60, 0x60, 0xf0, 0x00},  // 0066 (f){0x00, 0x00, 0x76, 0xcc, 0xcc, 0x7c, 0x0c, 0xf8},  // 0067 (g){0xe0, 0x60, 0x6c, 0x76, 0x66, 0x66, 0xe6, 0x00},  // 0068 (h){0x30, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00},  // 0069 (i){0x0c, 0x00, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0x78},  // 006a (j){0xe0, 0x60, 0x66, 0x6c, 0x78, 0x6c, 0xe6, 0x00},  // 006b (k){0x70, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00},  // 006c (l){0x00, 0x00, 0xcc, 0xfe, 0xfe, 0xd6, 0xc6, 0x00},  // 006d (m){0x00, 0x00, 0xf8, 0xcc, 0xcc, 0xcc, 0xcc, 0x00},  // 006e (n){0x00, 0x00, 0x78, 0xcc, 0xcc, 0xcc, 0x78, 0x00},  // 006f (o){0x00, 0x00, 0xdc, 0x66, 0x66, 0x7c, 0x60, 0xf0},  // 0070 (p){0x00, 0x00, 0x76, 0xcc, 0xcc, 0x7c, 0x0c, 0x1e},  // 0071 (q){0x00, 0x00, 0xdc, 0x76, 0x66, 0x60, 0xf0, 0x00},  // 0072 (r){0x00, 0x00, 0x7c, 0xc0, 0x78, 0x0c, 0xf8, 0x00},  // 0073 (s){0x10, 0x30, 0x7c, 0x30, 0x30, 0x34, 0x18, 0x00},  // 0074 (t){0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00},  // 0075 (u){0x00, 0x00, 0xcc, 0xcc, 0xcc, 0x78, 0x30, 0x00},  // 0076 (v){0x00, 0x00, 0xc6, 0xd6, 0xfe, 0xfe, 0x6c, 0x00},  // 0077 (w){0x00, 0x00, 0xc6, 0x6c, 0x38, 0x6c, 0xc6, 0x00},  // 0078 (x){0x00, 0x00, 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0xf8},  // 0079 (y){0x00, 0x00, 0xfc, 0x98, 0x30, 0x64, 0xfc, 0x00},  // 007a (z){0x1c, 0x30, 0x30, 0xe0, 0x30, 0x30, 0x1c, 0x00},  // 007b (braceleft){0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00},  // 007c (bar){0xe0, 0x30, 0x30, 0x1c, 0x30, 0x30, 0xe0, 0x00},  // 007d (braceright){0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 007e (asciitilde){0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0x00},  // 007f (uni007F)// ---------------------------  160-255 ---------------------------{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 00a0 (uni00A0){0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00},  // 00a1 (exclamdown){0x18, 0x18, 0x7e, 0xc0, 0xc0, 0x7e, 0x18, 0x18},  // 00a2 (cent){0x38, 0x6c, 0x64, 0xf0, 0x60, 0xe6, 0xfc, 0x00},  // 00a3 (sterling){0x00, 0xc6, 0x7c, 0xc6, 0xc6, 0x7c, 0xc6, 0x00},  // 00a4 (currency){0xcc, 0xcc, 0x78, 0xfc, 0x30, 0xfc, 0x30, 0x30},  // 00a5 (yen){0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00},  // 00a6 (brokenbar){0x3e, 0x63, 0x38, 0x6c, 0x6c, 0x38, 0xcc, 0x78},  // 00a7 (section){0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 00a8 (dieresis){0x7e, 0x81, 0x9d, 0xa1, 0xa1, 0x9d, 0x81, 0x7e},  // 00a9 (copyright){0x3c, 0x6c, 0x6c, 0x3e, 0x00, 0x7e, 0x00, 0x00},  // 00aa (ordfeminine){0x00, 0x33, 0x66, 0xcc, 0x66, 0x33, 0x00, 0x00},  // 00ab (guillemotleft){0x00, 0x00, 0x00, 0xfc, 0x0c, 0x0c, 0x00, 0x00},  // 00ac (logicalnot){0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00},  // 00ad (uni00AD){0x7e, 0x81, 0xb9, 0xa5, 0xb9, 0xa5, 0x81, 0x7e},  // 00ae (registered){0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},  // 00af (macron){0x38, 0x6c, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00},  // 00b0 (degree){0x30, 0x30, 0xfc, 0x30, 0x30, 0x00, 0xfc, 0x00},  // 00b1 (plusminus){0x70, 0x18, 0x30, 0x60, 0x78, 0x00, 0x00, 0x00},  // 00b2 (uni00B2){0x70, 0x18, 0x30, 0x18, 0x70, 0x00, 0x00, 0x00},  // 00b3 (uni00B3){0x0c, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00},  // 00b4 (acute){0x00, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x60, 0xc0},  // 00b5 (mu){0x7f, 0xdb, 0xdb, 0x7b, 0x1b, 0x1b, 0x1b, 0x00},  // 00b6 (paragraph){0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00},  // 00b7 (periodcentered){0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x0c, 0x38},  // 00b8 (cedilla){0x30, 0x70, 0x30, 0x30, 0x78, 0x00, 0x00, 0x00},  // 00b9 (uni00B9){0x38, 0x6c, 0x6c, 0x38, 0x00, 0x7c, 0x00, 0x00},  // 00ba (ordmasculine){0x00, 0xcc, 0x66, 0x33, 0x66, 0xcc, 0x00, 0x00},  // 00bb (guillemotright){0xc3, 0xc6, 0xcc, 0xdb, 0x37, 0x6f, 0xcf, 0x03},  // 00bc (onequarter){0xc3, 0xc6, 0xcc, 0xde, 0x33, 0x66, 0xcc, 0x0f},  // 00bd (onehalf){0xe0, 0x33, 0x66, 0x3c, 0xfb, 0x37, 0x6f, 0xc3},  // 00be (threequarters){0x30, 0x00, 0x30, 0x60, 0xc0, 0xcc, 0x78, 0x00},  // 00bf (questiondown){0xc0, 0x38, 0x6c, 0xc6, 0xfe, 0xc6, 0xc6, 0x00},  // 00c0 (Agrave){0x06, 0x38, 0x6c, 0xc6, 0xfe, 0xc6, 0xc6, 0x00},  // 00c1 (Aacute){0x7c, 0xc6, 0x38, 0x6c, 0xc6, 0xfe, 0xc6, 0x00},  // 00c2 (Acircumflex){0x76, 0xdc, 0x38, 0x6c, 0xc6, 0xfe, 0xc6, 0x00},  // 00c3 (Atilde){0xc6, 0x38, 0x6c, 0xc6, 0xfe, 0xc6, 0xc6, 0x00},  // 00c4 (Adieresis){0x30, 0x30, 0x00, 0x78, 0xcc, 0xfc, 0xcc, 0x00},  // 00c5 (Aring){0x3e, 0x6c, 0xcc, 0xfe, 0xcc, 0xcc, 0xce, 0x00},  // 00c6 (AE){0x78, 0xcc, 0xc0, 0xcc, 0x78, 0x18, 0x0c, 0x78},  // 00c7 (Ccedilla){0xe0, 0x00, 0xfc, 0x60, 0x78, 0x60, 0xfc, 0x00},  // 00c8 (Egrave){0x1c, 0x00, 0xfc, 0x60, 0x78, 0x60, 0xfc, 0x00},  // 00c9 (Eacute){0x78, 0xcc, 0xfc, 0x60, 0x78, 0x60, 0xfc, 0x00},  // 00ca (Ecircumflex){0xcc, 0x00, 0xfc, 0x60, 0x78, 0x60, 0xfc, 0x00},  // 00cb (Edieresis){0xe0, 0x00, 0x78, 0x30, 0x30, 0x30, 0x78, 0x00},  // 00cc (Igrave){0x1c, 0x00, 0x78, 0x30, 0x30, 0x30, 0x78, 0x00},  // 00cd (Iacute){0x7e, 0xc3, 0x3c, 0x18, 0x18, 0x18, 0x3c, 0x00},  // 00ce (Icircumflex){0xcc, 0x00, 0x78, 0x30, 0x30, 0x30, 0x78, 0x00},  // 00cf (Idieresis){0xf8, 0x6c, 0x66, 0xf6, 0x66, 0x6c, 0xf8, 0x00},  // 00d0 (Eth){0xfc, 0x00, 0xcc, 0xec, 0xfc, 0xdc, 0xcc, 0x00},  // 00d1 (Ntilde){0xc0, 0x38, 0x6c, 0xc6, 0xc6, 0x6c, 0x38, 0x00},  // 00d2 (Ograve){0x06, 0x38, 0x6c, 0xc6, 0xc6, 0x6c, 0x38, 0x00},  // 00d3 (Oacute){0x7c, 0xc6, 0x38, 0x6c, 0xc6, 0x6c, 0x38, 0x00},  // 00d4 (Ocircumflex){0x76, 0xdc, 0x38, 0x6c, 0xc6, 0x6c, 0x38, 0x00},  // 00d5 (Otilde){0xc3, 0x18, 0x3c, 0x66, 0x66, 0x3c, 0x18, 0x00},  // 00d6 (Odieresis){0x00, 0xc6, 0x6c, 0x38, 0x6c, 0xc6, 0x00, 0x00},  // 00d7 (multiply){0x3a, 0x6c, 0xce, 0xd6, 0xe6, 0x6c, 0xb8, 0x00},  // 00d8 (Oslash){0xe0, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x00},  // 00d9 (Ugrave){0x1c, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x00},  // 00da (Uacute){0x7c, 0xc6, 0x00, 0xc6, 0xc6, 0xc6, 0x7c, 0x00},  // 00db (Ucircumflex){0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x00},  // 00dc (Udieresis){0x1c, 0x00, 0xcc, 0xcc, 0x78, 0x30, 0x78, 0x00},  // 00dd (Yacute){0xf0, 0x60, 0x7c, 0x66, 0x7c, 0x60, 0xf0, 0x00},  // 00de (Thorn){0x78, 0xcc, 0xcc, 0xd8, 0xcc, 0xc6, 0xcc, 0x00},  // 00df (germandbls){0xe0, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0x7e, 0x00},  // 00e0 (agrave){0x1c, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0x7e, 0x00},  // 00e1 (aacute){0x7e, 0xc3, 0x3c, 0x06, 0x3e, 0x66, 0x3f, 0x00},  // 00e2 (acircumflex){0x76, 0xdc, 0x78, 0x0c, 0x7c, 0xcc, 0x7e, 0x00},  // 00e3 (atilde){0xcc, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0x7e, 0x00},  // 00e4 (adieresis){0x30, 0x30, 0x78, 0x0c, 0x7c, 0xcc, 0x7e, 0x00},  // 00e5 (aring){0x00, 0x00, 0x7f, 0x0c, 0x7f, 0xcc, 0x7f, 0x00},  // 00e6 (ae){0x00, 0x00, 0x78, 0xc0, 0xc0, 0x78, 0x0c, 0x38},  // 00e7 (ccedilla){0xe0, 0x00, 0x78, 0xcc, 0xfc, 0xc0, 0x78, 0x00},  // 00e8 (egrave){0x1c, 0x00, 0x78, 0xcc, 0xfc, 0xc0, 0x78, 0x00},  // 00e9 (eacute){0x7e, 0xc3, 0x3c, 0x66, 0x7e, 0x60, 0x3c, 0x00},  // 00ea (ecircumflex){0xcc, 0x00, 0x78, 0xcc, 0xfc, 0xc0, 0x78, 0x00},  // 00eb (edieresis){0xe0, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00},  // 00ec (igrave){0x38, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00},  // 00ed (iacute){0x7c, 0xc6, 0x38, 0x18, 0x18, 0x18, 0x3c, 0x00},  // 00ee (icircumflex){0xcc, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00},  // 00ef (idieresis){0x30, 0x7e, 0x0c, 0x7c, 0xcc, 0xcc, 0x78, 0x00},  // 00f0 (eth){0x00, 0xf8, 0x00, 0xf8, 0xcc, 0xcc, 0xcc, 0x00},  // 00f1 (ntilde){0x00, 0xe0, 0x00, 0x78, 0xcc, 0xcc, 0x78, 0x00},  // 00f2 (ograve){0x00, 0x1c, 0x00, 0x78, 0xcc, 0xcc, 0x78, 0x00},  // 00f3 (oacute){0x78, 0xcc, 0x00, 0x78, 0xcc, 0xcc, 0x78, 0x00},  // 00f4 (ocircumflex){0x76, 0xdc, 0x00, 0x78, 0xcc, 0xcc, 0x78, 0x00},  // 00f5 (otilde){0x00, 0xcc, 0x00, 0x78, 0xcc, 0xcc, 0x78, 0x00},  // 00f6 (odieresis){0x30, 0x30, 0x00, 0xfc, 0x00, 0x30, 0x30, 0x00},  // 00f7 (divide){0x00, 0x02, 0x7c, 0xce, 0xd6, 0xe6, 0x7c, 0x80},  // 00f8 (oslash){0x00, 0xe0, 0x00, 0xcc, 0xcc, 0xcc, 0x7e, 0x00},  // 00f9 (ugrave){0x00, 0x1c, 0x00, 0xcc, 0xcc, 0xcc, 0x7e, 0x00},  // 00fa (uacute){0x78, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0x7e, 0x00},  // 00fb (ucircumflex){0x00, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0x7e, 0x00},  // 00fc (udieresis){0x00, 0x1c, 0x00, 0xcc, 0xcc, 0x7c, 0x0c, 0x78},  // 00fd (yacute){0xe0, 0x60, 0x7c, 0x66, 0x66, 0x7c, 0x60, 0xf0},  // 00fe (thorn){0x00, 0xcc, 0x00, 0xcc, 0xcc, 0x7c, 0x0c, 0xf8},  // 00ff (ydieresis)
};static inline const uint8_t* charBitmap(char c) {uint8_t idx = static_cast<uint8_t>(c);return font8x8_ib8x8u[idx];
}static inline void drawChar(void *data,int w, int h, PixFmt fmt,int x0, int y0, char c,int scale,uint8_t r = 255, uint8_t g = 255, uint8_t b = 255,uint8_t Y = 235, uint8_t U = 128, uint8_t V = 128);static inline void writeText(void *data,int imgW, int imgH, PixFmt imgFmt,int x, int y, const char *text,uint8_t r = 255, uint8_t g = 0, uint8_t b = 0,uint8_t Y = 76, uint8_t U = 84, uint8_t V = 255,int scale = 4, int space = 9);/* ---------- 實現 ---------- */
static inline void putPixel(void *data,int w, int h, PixFmt fmt,int x, int y,uint8_t r, uint8_t g, uint8_t b,uint8_t Y, uint8_t U, uint8_t V)
{if (fmt == PixFmt::RGB24) {uint8_t* p = static_cast<uint8_t*>(data) + (y * w + x) * 3;p[0] = r; p[1] = g; p[2] = b;} else if (fmt == PixFmt::YUV_NV12) {uint8_t* Y_plane = static_cast<uint8_t*>(data);uint8_t* U_plane = Y_plane + w * h;uint8_t* V_plane = U_plane + (w / 2) * (h / 2);uint8_t* UV_plane = Y_plane + w * h;Y_plane[y * w + x] = Y;int x2 = x / 2, y2 = y / 2;UV_plane[y2 * w + x] = U;UV_plane[y2 * w + x + 1] = V;}
}static inline void drawChar(void *data,int w, int h, PixFmt fmt,int x0, int y0, char c,int scale,uint8_t r, uint8_t g, uint8_t b,uint8_t Y, uint8_t U, uint8_t V)
{const uint8_t* bm = charBitmap(c);for (int row = 0; row < 8; ++row) {uint8_t bits = bm[row];for (int col = 0; col < 8; ++col) {if (!(bits & (1 << (7 - col)))) continue;for (int dy = 0; dy < scale; ++dy)for (int dx = 0; dx < scale; ++dx) {int px = x0 + col * scale + dx;int py = y0 + row * scale + dy;if (px < 0 || px >= w || py < 0 || py >= h) continue;putPixel(data, w, h, fmt, px, py, r, g, b, Y, U, V);}}}
}static inline void writeText(void *data,int imgW, int imgH, PixFmt imgFmt,int x, int y,const char *text,uint8_t r, uint8_t g, uint8_t b,uint8_t Y, uint8_t U, uint8_t V,int scale, int space)
{for (; *text; ++text) {drawChar(data, imgW, imgH, imgFmt, x, y, *text, scale, r, g, b, Y, U, V);x += space * scale;}
}static inline void writeTextRgb(void *data, int imgW, int imgH,int x, int y, int fontSize,const char *text,uint8_t r=255, uint8_t g=0, uint8_t b=0)
{int space = 8;for (; *text; ++text){drawChar(data, imgW, imgH, PixFmt::RGB24, x, y, *text, fontSize, r, g, b);x += space * fontSize;}
}static inline bool savePPM(const char *filename, void *rgb, int w, int h) {FILE *fp = fopen(filename, "wb");if (!fp) return false;fprintf(fp, "P6\n%d %d\n255\n", w, h);fwrite(rgb, 1, w * h * 3, fp);fclose(fp);return true;
}
}int main() {int imgW = 600;int imgH = 200;uint8_t rgb[imgW * imgH * 3];// set background colorstd::memset(rgb, 255, imgW * imgH * 3);// write text// OVERLAY::writeTextRgb(rgb, imgW, imgH, 10, 20, 1, "Good Job~ ", 255);OVERLAY::writeTextRgb(rgb, imgW, imgH, 10, 10, 2, "Good Job~ ", 255);OVERLAY::writeTextRgb(rgb, imgW, imgH, 10, 40, 3, "Good Job~ ", 25, 150, 66);OVERLAY::writeTextRgb(rgb, imgW, imgH, 10, 80, 4, "Good Job~ ", 2, 4, 6);OVERLAY::writeTextRgb(rgb, imgW, imgH, 10, 120, 4, "Data: 8 Aug. 2025", 0, 0, 255);OVERLAY::savePPM("save.ppm", rgb, imgW, imgH);return 0;
}#endif

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/918067.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/918067.shtml
英文地址,請注明出處:http://en.pswp.cn/news/918067.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

前端開發(HTML,CSS,VUE,JS)從入門到精通!第八天(Vue框架及其安裝)(完結篇) 重點 ! ! !

十三、Vue 單文件組件1&#xff0e;在前面學習的傳統組件存在以下問題&#xff1a;&#xff08;1&#xff09;全局定義的組件必須保證組件名不能重復。&#xff08;2&#xff09;字符串的模板缺乏高亮語法&#xff0c;在寫多行 HTML 片段的時候&#xff0c;需要用到丑陋的 ”\”…

2025最新國內服務器可用docker源倉庫地址大全(2025年8月更新) · DockerHub鏡像加速全面指南

2025最新國內服務器可用docker源倉庫地址大全&#xff08;2025年8月更新&#xff09; DockerHub鏡像加速全面指南 2025年8月&#xff0c;隨著云原生技術的深入普及&#xff0c;開發者在使用 Docker 拉取 鏡像 時&#xff0c;經常遭遇 超時、鏡像下載失敗、無法拉取 等網絡瓶頸…

GitLab同步提交的用戶設置

內容&#xff1a;在GitLab同步提交的用戶設置中&#xff0c;部分用戶的代碼提交仍未與GitLab同步&#xff0c;導致無法在GitLab上顯示提交者的用戶名。1、檢查下gitlab賬戶的設置 登錄gitlab后&#xff0c;右上角個人頭像點開后&#xff0c;可以看到姓名和賬戶2、不對的話&…

Web 圖像捕獲革命:ImageCapture API 全面解析與實戰指南

概述 ImageCapture API 是 Web API 的一部分&#xff0c;允許網頁應用直接訪問和控制設備攝像頭&#xff0c;實現高質量的圖像捕獲功能。該 API 提供了比傳統的 getUserMedia() 更精細的控制能力&#xff0c;支持設置分辨率、白平衡、曝光等參數。 核心特性 1. 高質量圖像捕…

ASP.NET三層架構成績管理系統源碼

一、系統簡介 本次設計的成績管理系統是基于ASP.NET WebForm技術開發的Web應用程序&#xff0c;采用經典的三層架構&#xff08;表示層、業務邏輯層、數據訪問層&#xff09;設計模式&#xff0c;結合前端HTML、JavaScript、jQuery及ECharts圖表庫&#xff0c;后端使用C#語言、…

Linux 內存管理之page folios

文章目錄前言一、簡介struct folio二、page folios的好處2.1 compound page2.2 page cache三、buffer_head、iomap與page folios四、何時分配 Large Folio五、folio結構體演變六、內核主線folio的逐步使用參考資料前言 Linux 內核的內存管理子系統以“頁”&#xff08;page&am…

[優選算法專題一雙指針——兩數之和](雙指針和哈希表)

題目鏈接 LeetCode兩數之和 題目描述 題目解析 注意&#xff1a;前提條件&#xff1a;輸入的數組numbers是已排序的。 核心思路&#xff1a;雙指針法 利用數組已排序的特性&#xff0c;通過兩個指針從兩端向中間移動&#xff0c;快速定位符合條件的兩個數&#xff0c;時間…

佳維視高亮度工業顯示器,強光環境清晰可見

在工業、戶外或高光照場景中&#xff0c;普通顯示器常因環境光干擾導致畫面模糊、色彩失真&#xff0c;甚至無法操作。高亮度工業顯示器通過技術優化與專業設計&#xff0c;突破光線限制&#xff0c;確保在強光下仍能呈現清晰、穩定的視覺效果&#xff0c;成為關鍵任務環境中的…

系統的緩存(buff/cache)是如何影響系統性能的?

系統的緩存&#xff08;buff/cache&#xff0c;包括 buffer 和 cache&#xff09;是 Linux 內核為提升系統性能設計的關鍵機制&#xff0c;其對性能的影響主要體現在加速數據訪問和平衡內存與磁盤速度差異上&#xff0c;具體如下&#xff1a; 一、buff/cache 的本質&#xff1a…

淺析 Berachain v2 ,對原有 PoL 機制進行了哪些升級?

Berachain 本身是一個特色鮮明的 Layer1 區塊鏈項目&#xff0c;其最具辨識度的創新在于采用了 PoL&#xff08;Proof of Liquidity&#xff09;區塊獎勵分配機制。該機制把鏈的區塊獎勵轉化為生態增長動力的協議內經濟機制&#xff0c;通過將絕大部分獎勵直接分配給生態中的用…

校招秋招春招小米在線測評小米測評題庫|測評解析和攻略|題庫分享

秒收測評 小米校招投遞簡歷之后會立馬收到在線測評&#xff0c;在線測評考察的內容就是行測和性格測試。 具體內容 小米在線測評有五部分組成&#xff0c;其中第一、二、三部分各限時 10 分鐘&#xff0c;并且每題只有 70 秒左右&#xff0c;時間到自動跳到下一題&#xff0…

遮天(帝國篇)

距離軒轅鴻天成為道盟盟主已經過去了三十年&#xff0c;卡薩帝國國君卡薩也在一次戰爭中被妖族所殺&#xff0c;留下了兩個年幼的兒子&#xff0c;長子卡利爾&#xff0c;次子卡修。 卡薩死后一直是大將軍戈隆掌控帝國事務&#xff0c;戈隆秉承著道盟見妖就殺的理念讓卡薩帝國成…

批量將NC格式數據轉換為TIF格式:解決轉換后圖像顛倒、鏡像、翻轉等問題

本文介紹基于Python中GDAL模塊&#xff0c;批量將大量.nc格式的柵格文件轉換為.tif格式&#xff0c;并解決可能出現的轉換后圖像顛倒、鏡像、翻轉等問題。最近&#xff0c;需要批量將大量.nc格式的柵格文件轉換為.tif格式。如下圖所示&#xff0c;有多個待轉換的.nc格式文件&am…

《論三生原理》重構數學哲學基礎語義場??

AI輔助創作&#xff1a;《論三生原理》通過算法化轉譯傳統文化符號、重構數學對象本體論及創新術語體系&#xff0c;系統性重構數學哲學基礎語義場&#xff0c;其核心路徑如下&#xff1a;&#x1f50d; 一、哲學符號的數學實體化?陰陽范疇的數理轉譯?將《周易》“陰/陽”抽象…

適用于在線3D測量和檢測的3D激光輪廓儀

Z-Trak? Express 1K5 系列是Z-Trak系列中的最新創新成果&#xff0c;專為實現經濟高效的在線3D測量和檢測而設計&#xff0c;在整個測量范圍內可實現每秒最多 5,000 個輪廓的測量速率&#xff0c;具有高速檢測能力和實時處理性能。Z-Trak? Express 1K5系列 3D激光輪廓儀Z-Tra…

主播生活模擬器2|主播人生模擬器2 (Streamer Life Simulator 2)免安裝中文版

網盤鏈接&#xff1a; 七主播生活模擬器2|主播人生模擬器2 名稱&#xff1a;七主播生活模擬器2|主播人生模擬器2 &#xff08;Streamer Life Simulator 2&#xff09;免安裝中文版 描述&#xff1a;《主播人生模擬器》是一款從零開始&#xff0c;努力成為一名受歡迎的網絡主…

解決React白板應用中的畫布內容丟失問題

解決React白板應用中的畫布內容丟失問題 在開發基于React的在線白板應用時&#xff0c;我們遇到了一個棘手問題&#xff1a;當用戶滾動到底部自動擴展畫布時&#xff0c;原有繪制內容會神秘消失。經過系統排查&#xff0c;最終通過Canvas API的巧妙運用解決了這個問題。以下是完…

韓國寶藍集團與Alpha World、非小號Alpha正式達成戰略合作

2025年8月1日&#xff0c;Boram Group(寶藍集團)旗下Boram Sangjo特銷團隊正式宣布&#xff0c;已與全球Web3平臺 Alpha World 以及加密數據平臺 非小號Alpha&#xff08;FXH Alpha&#xff09;達成三方戰略合作。始于1991–1992年創立的 Boram Sangjo Development隸屬于Boram …

手動開發一個TCP服務器調試工具(二):無界面 TCP 通信服最小實現

本篇將講解如何使用 Qt 構建一個簡單但完整的TCP 服務端&#xff0c;無需圖形界面。? 程序功能概覽 啟動一個監聽本地 12345 端口的 TCP 服務&#xff1b;有客戶端連接時輸出信息&#xff1b;每秒向客戶端發送一次當前時間&#xff1b;支持接收客戶端數據&#xff1b;客戶端斷…

??大語言模型(LLM)實戰應用:從微調到部署全流程??

摘要?? 大語言模型&#xff08;LLM&#xff09;已成為AI落地的核心驅動力&#xff0c;但其從預訓練狀態到生產環境的轉化仍面臨技術復雜度高、資源消耗大等挑戰。本文系統梳理LLM實戰全流程&#xff0c;涵蓋??微調策略選擇??、??量化壓縮技術??、??部署優化方案??…