@@ -40,72 +40,96 @@ jobs:
4040
4141 - name : Create test.c
4242 run : |
43- mkdir test && cd test
44- cat > test.c << 'EOF'
43+ mkdir -p test
44+ cat > test/test .c <<'EOF'
4545 #include <stdio.h>
4646 #include <stdint.h>
47-
48- /* ========== OpenCvSharpExtern exported C prototypes ========== */
49- typedef struct Mat Mat;
50- typedef struct { double val[4]; } Scalar;
51- typedef struct { int x; int y; } Point;
52-
47+ #include <assert.h>
48+
49+ /* ==== 简易类型 / 宏定义 ==== */
50+ typedef long long uint64; /* 对应 C# 的 UInt64 */
51+ typedef int ExceptionStatus; /* OpenCvSharpExtern 约定:0 = OK */
52+ typedef struct { double val[4]; } MyCvScalar;
53+ typedef struct cv_Mat cv_Mat; /* 不需要知道内部实现 */
54+
55+ /* OpenCV 常量(直接抄一份足够用即可) */
56+ #define CV_8UC3 16 /* 8-bit unsigned, 3 channels */
57+ #define IMWRITE_JPEG_QUALITY 1
58+
59+ /* ==== C API 声明 ==== */
5360 /* core */
54- int core_Mat_sizeof(void);
55- Mat* core_Mat_new2(int rows, int cols, int type);
56- void core_Mat_delete(Mat* mat);
57- uint8_t* core_Mat_data(Mat* mat);
58- int core_Mat_rows(Mat* mat);
59- int core_Mat_cols(Mat* mat);
60- int core_Mat_type(Mat* mat);
61-
61+ extern uint64 core_Mat_sizeof(void);
62+ extern ExceptionStatus core_Mat_new3(int rows,int cols,int type,
63+ MyCvScalar scalar, cv_Mat **returnValue);
64+ extern ExceptionStatus core_Mat_delete(cv_Mat *self);
6265 /* imgcodecs */
63- int imgcodecs_imwrite(const char* fileName, Mat* mat,
64- const int* params, int paramsLength);
65-
66- /* ========== Convenience macro (same数值和 OpenCV 保持一致) ========== */
67- # define CV_8U 0
68- # define CV_CN_SHIFT 3
69- # define CV_MAKETYPE(depth, cn) ( (depth) + ( (cn - 1) << CV_CN_SHIFT ) )
70- # define CV_8UC3 CV_MAKETYPE(CV_8U,3)
71-
66+ extern ExceptionStatus imgcodecs_imwrite(const char *filename, cv_Mat *img,
67+ int *params,int paramsLength,int *returnValue);
68+ extern ExceptionStatus imgcodecs_imread (const char *filename,int flags,
69+ cv_Mat **returnValue);
70+
71+ /* ==== 帮助函数:检查返回值 ==== */
72+ static void CHECK_OK(ExceptionStatus st, const char *msg)
73+ {
74+ if(st != 0) { fprintf(stderr,"%s failed: %d\n", msg, st); exit(st); }
75+ }
76+ static void CHECK_BOOL(int ok, const char *msg)
77+ {
78+ if(!ok) { fprintf(stderr,"%s returned false\n", msg); exit(1); }
79+ }
80+
7281 int main(void)
7382 {
74- printf("sizeof(cv:: Mat) reported by core_Mat_sizeof = %d bytes \n",
75- core_Mat_sizeof());
76-
77- /* 1. 创建 100×100×3 uchar 图像 */
78- Mat* img = core_Mat_new2(100, 100, CV_8UC3) ;
79- if (!img) {
80- fprintf(stderr , "core_Mat_new2 failed\n ");
81- return 1;
82- }
83-
84- /* 2. 填充像素:让 B=行, G=列, R=(行+列)/2 */
85- uint8_t* data = core_Mat_data(img );
86- int rows = core_Mat_rows(img);
87- int cols = core_Mat_cols(img);
88- for (int r = 0; r < rows ; ++r) {
89- for (int c = 0; c < cols; ++c) {
90- int idx = (r * cols + c) * 3;
91- data[idx + 0] = (uint8_t)r ; /* B */
92- data[idx + 1] = (uint8_t)c ; /* G */
93- data[idx + 2] = (uint8_t)((r + c) >> 1); /* R */
83+ printf("sizeof(Mat) reported by native = %llu \n",
84+ (unsigned long long) core_Mat_sizeof());
85+
86+ /* 1. 先创建一张 256×256、彩色渐变图像 ----------------------------- */
87+ cv_Mat * img = NULL ;
88+ MyCvScalar black = {0};
89+ CHECK_OK(core_Mat_new3(256, 256, CV_8UC3, black, &img) , "core_Mat_new3 ");
90+
91+ /* 通过指针手动绘制一个 BGR 渐变:B = x, G = y, R = 128 */
92+ unsigned char *data = NULL;
93+ extern ExceptionStatus core_Mat_data(cv_Mat *self, unsigned char **returnValue);
94+ CHECK_OK(core_Mat_data(img, & data), " core_Mat_data" );
95+ for( int y = 0; y < 256; ++y)
96+ {
97+ for (int x = 0; x < 256 ; ++x)
98+ {
99+ unsigned char *pix = data + (y*256 + x)* 3;
100+ pix[ 0] = (unsigned char)x ; /* Blue 渐变 */
101+ pix[ 1] = (unsigned char)y ; /* Green 渐变 */
102+ pix[ 2] = 128; /* Red 固定 */
94103 }
95104 }
96-
97- /* 3. 写入 PNG 文件 */
98- const char* outName = "test-output.png";
99- int ok = imgcodecs_imwrite(outName, img, NULL, 0);
100- printf("imgcodecs_imwrite(\"%s\") returned %d\n", outName, ok);
101-
102- /* 4. 清理 */
105+
106+ /* 2. 保存为 PNG -------------------------------------------------- */
107+ int ok = 0;
108+ CHECK_OK(imgcodecs_imwrite("test.png", img, NULL, 0, &ok), "imwrite PNG");
109+ CHECK_BOOL(ok, "imwrite PNG");
110+
111+ /* 3. 读取刚写出的 PNG ------------------------------------------- */
112+ cv_Mat *img2 = NULL;
113+ CHECK_OK(imgcodecs_imread("test.png", /*flags=*/1, &img2), "imread PNG");
114+ /* 不需要检查 NULL,因为 C API 出错会抛异常,已在上一步捕获 */
115+
116+ /* 4. 以 JPEG 质量 90 再保存为 JPG -------------------------------- */
117+ int jpegParams[2] = { IMWRITE_JPEG_QUALITY, 90 };
118+ CHECK_OK(imgcodecs_imwrite("test.jpg", img2,
119+ jpegParams, 2, &ok), "imwrite JPG");
120+ CHECK_BOOL(ok, "imwrite JPG");
121+
122+ printf("PNG and JPG written successfully.\n");
123+
124+ /* 5. 释放资源 ---------------------------------------------------- */
103125 core_Mat_delete(img);
104- return ok ? 0 : 1;
126+ core_Mat_delete(img2);
127+
128+ return 0;
105129 }
106130 EOF
107- cat test.c
108-
131+ cat test/test .c
132+
109133 - name : Setup MSVC(Windows only)
110134 uses : ilammy/msvc-dev-cmd@v1
111135 if : startsWith(matrix.os, 'win')
0 commit comments