mylib使用说明

本文档详细介绍了mylib库中array的结构,包括PLAIN_KIND、RGB_KIND和RGBA_KIND等类型,以及Value_Type的各种数据类型。此外,还阐述了从tif文件读取图像到array以及将array写回图像的流程。通过对Array_Kind和Value_Type的理解,以及Read_Image和Write_Image函数的使用,可以帮助开发者更好地掌握mylib进行图像操作的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//mylib命名空间定义
namespace mylib
{
extern "C"
{
#include "mylib/mylib.h"
#include "mylib/array.h"
#include "mylib/image.h"
#include "mylib/histogram.h"
}
};

以下主要说明使用array.h,image.h的方式

array的结构

typedef struct
  { Array_Kind  kind;    //  Interpreation of the array: one of the four enum constants above
    Value_Type  type;    //  Type of values, one of the eight enum constants above
    int         scale;   //  # of bits in integer values

    int         ndims;   //  Number of dimensions of the array
    Size_Type   size;    //  Total number of elements in the array (= PROD_i dims[i])
    Dimn_Type  *dims;    //  dims[i] = length of dimension i

    int         tlen;    //  Length of the text string text
    string      text;    //  An arbitrary string label

    void       *data;    //  A block of size sizeof(type) * size bytes holding the array.
  } Array;

Array_Kind : { PLAIN_KIND, RGB_KIND, RGBA_KIND, COMPLEX_KIND }
If an RGB_KIND array, then the outermost dimension is 3 and (A[0,α],A[1,α],A[2,α]) is an rgb color triple for each index sequence α. If an RGBA_KIND array, then the outermost dimension is 4 and (A[0,α],A[1,α],A[2,α],A[3,α]) is an rgba color for each α.
Value_Type : { UINT8_TYPE, UINT16_TYPE, UINT32_TYPE, UINT64_TYPE,
INT8_TYPE, INT16_TYPE, INT32_TYPE, INT64_TYPE,
FLOAT32_TYPE, FLOAT64_TYPE }

读取image流程

读取tif某时间点,保存到array中间去。

string imgFilename(basename + ".tif");
mylib::Array* img = mylib::Read_Image((char*)(imgFilename.c_str()),0);

上面的函数说明:
Array *G(Read_Image)(string file_name, int layer)
{ return (read_array(image_reader,”Read_Image”,file_name,layer,NULL)); }

写入image流程

boolean Write_Image(string file_name, Array *image, Image_Compress compress)
{ Layer_Bundle WList;
  Array       *AList[1];
  Image_Target Target;

  WList.num_layers = 1;
  WList.layers     = AList;
  AList[0]         = image;

  Target.file = file_name;
  return (write_tiff("Write_Image",&Target,image_writer,&WList,NULL,compress));
}

写入流程:


//1、定义写入图像名称
string imgRawFilename(imgBasename + "RawBckgSubt_" + itoa + ".tif" );
//2、构造array的纬度和大小
const static int dimsImage = 3;//to be able to precompile code
mylib::Dimn_Type dims[dimsImage];
for(int ii = 0; ii<dimsImage; ii++) 
    dims[ii] =dims[ii] = supervoxel::dataDims[ii];
//3、构造RGB_KIND的array
mylib::Array* canvas=Make_Array(mylib::RGB_KIND, mylib::UINT8_TYPE, dimsImage, dims);
//4、构造array数据
***(1)PLAIN_KIND的数据*** 
mylib::Array* imgL=mylib::Make_Array(mylib::PLAIN_KIND, mylib::UINT16_TYPE,dimsImage, dims);//声明array
mylib::uint16* imgLptr = (mylib::uint16*)(imgL->data);//指向array的data
memset(imgLptr,0,sizeof(mylib::uint16) * (imgL->size));//set all to background
mylib::uint16 auxL = 1;//初始亮度值,设置1;每个supervoxel的亮度一样,不一样的相邻的supervoxel的亮度设置为相差1
    for(list<supervoxel>::const_iterator iterS = supervoxelsList[TM].begin(); iterS != supervoxelsList[TM].end(); ++iterS)//循环每个supervoxel
    {
        for(vector<uint64>::const_iterator iter = iterS->PixelIdxList.begin(); iter != iterS->PixelIdxList.end(); ++iter)//循环每个supervoxel内的pixel
        {
            imgLptr[*iter] = auxL;
        }
        auxL++;//更新亮度值,这里可以自己设置含义
    }

(2)RGB_KIND的数据
mylib::Array* canvas=Make_Array(mylib::RGB_KIND, mylib::UINT8_TYPE, dimsImage, imgCropped->dims);
mylib::uint8* canvasPtr=(mylib::uint8*)(canvas->data);
double rangeLH=(double)(thrH-thrL);
//循环写入RGB三个分量的数据
for(int cc=0;cc<3;cc++)//the same for loop per color {
    //根据图片的原本数据来判断,imgCropped->data保存的是图像本身的数据(也可以像(1)中一样,在遍历piexllist中操作)
    mylib::uint16* imPtr=(mylib::uint16*)(imgCropped->data);
    for(mylib::Size_Type ii=0;ii<imgCropped->size;ii++){
        if(*imPtr<=thrL)    *canvasPtr=0;
        else if(*imPtr>=thrH)   *canvasPtr=255;
        else{
        //在除去过低亮度和过高亮度的值之间的数据,这样导致RGB每个分量的值是一样的。我们可以在外围构建一个图谱。或者直接在赋值语句上增加外围的变量
        *canvasPtr=(mylib::uint8)floor((255.0*(((double)((*imPtr)-thrL))/rangeLH)));
            }
        canvasPtr++;
        imPtr++;
        }
    }
//5、传入参数,绘制图像
mylib::Write_Image ((char*)(imgRawFilename.c_str()), canvas, mylib::DONT_PRESS)

总体介绍

//读取一个时间点的图片
Array * Read_ImageG (string file_name, int layer)
//读取一个tif内所有图片
Layer_Bundle *  Read_Images (string file_name, Layer_Bundle *images RM)
//保存一个时间点的图片
boolean Write_Image (string file_name, Array *array, Image_Compress comp)
//保存多个时间点的图片
boolean Write_Images (string file_name, Layer_Bundle *images, Image_Compress comp)
### Java2OP 使用指南概述 Java2OP 是一个用于生成 Object Pascal 原生桥接文件的工具,它允许开发者通过这些桥接文件访问 Android 平台上的 Java 库。以下是关于如何使用 Java2OP 的详细介绍: #### 工具功能描述 Java2OP.exe 是一个命令行工具,其主要作用是从现有的 Java 类库(JAR 文件或单独的 `.class` 文件)生成对应的 Object Pascal 定义文件。这些定义文件充当桥梁角色,使得 Delphi 或 C++Builder 开发的应用能够调用底层的 Java 功能[^2]。 #### 使用方法 要成功运行 Java2OP,需遵循以下规则和参数设置: 1. **基本语法** ```bash java2op [-options...] JAR_FILE... ``` 参数 `-options...` 表示可选配置项,而 `JAR_FILE...` 则表示目标 JAR 文件路径。 2. **常用选项** 下面列举了一些常用的命令行选项及其含义: - `-package=<Package Name>`: 指定需要处理的具体包名。如果未指定,则默认解析整个 JAR 文件中的所有包。 - `-outputdir=<Directory Path>`: 设置输出目录,默认为当前工作目录。 - `-recurse`: 启用递归模式,自动扫描子包内的内容并生成相应的桥接文件。 - `-loglevel=LEVEL`: 控制日志记录级别,可用值包括 `ERROR`, `WARN`, `INFO`, 和 `DEBUG`. 3. **实例演示** 假设有一个名为 `example.jar` 的文件,并希望仅针对其中的某个特定包创建桥接文件,可以执行如下命令: ```bash java2op -package=com.example.mylib -outputdir=C:\BridgeFiles example.jar ``` 4. **注意事项** - 输入的 JAR 文件应确保完整无损,且包含必要的元数据信息以便于正确解析。 - 输出的桥接文件仅为声明性质,实际逻辑仍依赖原始 JAR 文件提供[^2]。 #### 技术细节补充 对于那些由 Javassist 修改过的类,在运行期间可能还需要额外加载来自 `javassist.runtime` 包的支持类。这是因为部分复杂操作涉及到了动态字节码生成技术,而这部分内容无法完全脱离框架独立运作[^1]。 ```java // 示例代码片段展示如何验证是否存在某外部依赖关系 try { Class.forName("javassist.runtime.Desc"); } catch (ClassNotFoundException e) { System.out.println("Missing required runtime support."); } ``` 以上便是围绕 Java2OP 及其关联知识点展开的一系列阐述。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值