Code Monkey home page Code Monkey logo

libczi's People

Contributors

cgohlke avatar dimin avatar harukizaemon avatar ptahmose avatar pthamose avatar sebi06 avatar toloudis avatar zeissmicroscopy avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

libczi's Issues

alligned_alloc gcc compatibility

alligned_alloc is not well supported in all versions of libstdc++, for example this bug report, so some g++ versions complain that it is missing even with #include <cstdlib> and using the namespace std::aligned_alloc.

Src/libCZI/stdAllocator.cpp already contains platform specific code, so would it be possible to change the aligned_alloc call to use posix_memalign instead? Specifically, change in Src/libCZI/stdAllocator.cpp:

#if defined(__GNUC__)
        //return aligned_alloc(32, size);
        void *pv;
        int res = posix_memalign(&pv, 32, size);
        return pv;
#else

I've verified this change works with g++ 6.4 and 7.3.
I can provide a pull request if desired.

eigen3 build is failing

Is anyone else seeing errors like this?
This just started happening a couple of weeks ago in our automated aicspylibczi builds. I assume Eigen updated something and the version being pulled by libCZI is not pinned. Or else github-actions changed some compiler configuration.

/home/runner/work/aicspylibczi/aicspylibczi/cmake-build-debug/libCZI/Src/vendor/eigen3/src/eigen_ext/Eigen/src/Core/util/Macros.h:624:2: error: This compiler appears to be too old to be supported by Eigen
#error This compiler appears to be too old to be supported by Eigen
 ^

Bitmap copy bug?

Hello,

I have been developing reader using libCZI. When I used this function. I was wondering if it the CBitmapOperations::Copy function should be copying from PixelType::Bgr48 to PixelType::Bgr48 using Copy<PixelType::Bgr48, PixelType::Bgr48> instead of Copy<PixelType::Bgr24, PixelType::Bgr24>.

The current implementation only copies half of the buffer.

in libCZI/BitmapOperations.cpp at line 131

/*static*/void CBitmapOperations::Copy(libCZI::PixelType srcPixelType, const void* srcPtr, int srcStride, libCZI::PixelType dstPixelType, void* dstPtr, int dstStride, int width, int height, bool drawTileBorder)
{
/*
 ...
*/
        case PixelType::Bgr48:
		switch (dstPixelType)
		{
		case PixelType::Gray8:break;
		case PixelType::Gray16:break;
		case PixelType::Gray32Float:break;
		case PixelType::Bgr24:break;
		case PixelType::Bgr48:
                        // should be Bgr48
			Copy<PixelType::Bgr48, PixelType::Bgr48>(srcPtr, srcStride, dstPtr, dstStride, width, height, drawTileBorder); 
			return;
		default:break;
		}
		break;

	default:break;
	}
/*
 ...
*/
}

low contrast thumbnail

I tried to extract Label and SlidePreview attachment, its color data is in bgr48 format.
its contrast is very much low, its hardly visible .

SlidePreview:
test_original

Label:
Label

currently i am converting bgr48 to rgb24 as follows
thumbnail[3 * i] = ((std::uint8_t)( data[3 * i + 2] >> 8 ));
thumbnail[3 * i + 1] = ((std::uint8_t)(data[3 * i + 1] >> 8));
thumbnail[3 * i + 2] = ((std::uint8_t)(data[3 * i + 0] >> 8));

is there any proper way to convert from bgr48 to rgb24?

memory initialisation in CHeapAllocator::Allocate

CHeapAllocator::Allocate seems no to initialise the allocated memory.

this is visible if more than one pixmap is created from the image data and the second extends beyond the area of a czi file.

this can be fixes by calling 'memset( pv, 0, size );' bevor the memory is returned from CHeapAllocator::Allocate.

this is not ideal as it incurs overhead for every pixmap. but fixing this only for pixmaps that extend beyond the visible area looks more complicated.

Inconsistent logical sizes

I'm having an issue with inconsistent logical sub-block sizes being reported by libCZI. I was originally having this problem on a tiled, pyramided microscope image that I am unable to share. However, I have been able to reproduce the problem by loading a non-tiled jpg image into Zen, generating a pyramid, and saving it as czi.

Here is the output I am getting from CZICmd:

Complete list of sub-blocks

#0: T0 M=-2147483648 logical=(0,0,7695,2160) phys.=(285,80) pixeltype=bgr24
#1: T0 M=-2147483648 logical=(0,0,6561,2160) phys.=(729,240) pixeltype=bgr24
#2: T0 M=-2147483648 logical=(6561,0,1125,2160) phys.=(125,240) pixeltype=bgr24
#3: T0 M=-2147483648 logical=(0,0,2187,2160) phys.=(729,720) pixeltype=bgr24
#4: T0 M=-2147483648 logical=(2187,0,2187,2160) phys.=(729,720) pixeltype=bgr24
#5: T0 M=-2147483648 logical=(4374,0,2187,2160) phys.=(729,720) pixeltype=bgr24
#6: T0 M=-2147483648 logical=(6561,0,1119,2160) phys.=(373,720) pixeltype=bgr24
#7: T0 M=-2147483648 logical=(0,0,7680,2160) phys.=(7680,2160) pixeltype=bgr24

Pyramid-Subblock-Statistics

number of subblocks with scale 1/1: 1
number of subblocks with scale 1/3: 4
number of subblocks with scale 1/9: 2
number of subblocks with scale 1/27: 1

Notice that the non-tiled, scale 1/1 sub-block (#7) has physical and logical size 7680, 2160. These are the correct dimensions of the image. However, the scale 1/27 sub-block (#0) has logical size 7695, 2160. I believe that this should be equal to the actual image size, but it is a little bigger. The other pyramid levels have the same problem; for example, if you add up the logical widths from the scale 1/9 sub-blocks (#1 and #2), you get 6561+1125=7686, which is also too big.

I'm not sure if this a problem with libCZI or with Zen itself, but perhaps a developer could advise?

I am attaching the example image.
example.zip

Incorrect image size returned by SubBlockStatistics

Reading image size using libCZI::SubBlockStatistics boundingBox returns a different number than is stored in the image XML or is computed enumerating tiles.

In my example on an Axio Scan.Z1 image produced by:
ZEN 2 (blue edition)
2.0.0.0

In boundingBox I observe:
w=84096
h=28032

In the XML under ///:
84007
28030

Enumerating tiles at scale==1.0 and using logicalRect I obtain:
w=84007
h=28030

What is the reason for this disparity and is this somehow an artifact of how TileAccessors work?

Incorrect Output in release build

I am getting different output in debug and release build ,can you please guide me what i am doing wrong?

`wstring filePath = L"D:\dev\images\zeis\SWTS_N_056_Liver_iADSS.czi";
auto stream = libCZI::CreateStreamFromFile(filePath.c_str());
auto cziReader = libCZI::CreateCZIReader();
cziReader->Open(stream);

auto subBlockStatistics = cziReader->GetStatistics();

libCZI::CDimCoordinate coordinate{ { DimensionIndex::C,0} };
libCZI::ISingleChannelPyramidLayerTileAccessor::Options scptaOptions; scptaOptions.Clear();
libCZI::ISingleChannelPyramidLayerTileAccessor::PyramidLayerInfo pyrLyrInfo;
pyrLyrInfo.minificationFactor = 2;
pyrLyrInfo.pyramidLayerNo = 6;

auto accessorp = cziReader->CreateSingleChannelPyramidLayerTileAccessor();
libCZI::ISingleChannelTileAccessor::Options sctaOptions; sctaOptions.Clear();

auto bb = subBlockStatistics.boundingBox;
int tilwidth = 512 * pow(2, pyrLyrInfo.pyramidLayerNo);

int numX = ceil((float)bb.w / tilwidth);
int numY = ceil((float)bb.h / tilwidth);

for (int i = 0; i < numY; i++)
{
for (int j = 0; j < numX; j++)
{
int startx = bb.x + j * tilwidth;
int starty = bb.y + i * tilwidth;
IntRect roi{ startx,starty,tilwidth,tilwidth };
auto re = accessorp->Get(roi, &coordinate, pyrLyrInfo, &scptaOptions);
std::wstring outputfilename = L"D:\cziOut\";
outputfilename += std::to_wstring(pyrLyrInfo.pyramidLayerNo);
outputfilename += L"\";
outputfilename += std::to_wstring(i);
outputfilename += L"_";
outputfilename += std::to_wstring(j);
outputfilename += L".png";
CSaveData save(outputfilename, SaveDataFormat::PNG);
save.Save(re.get());
}
}`

Debug mode output:
debug

Release mode output:
release

Add install instructions and cmake project configuration

Currently libCZI can not directly be used by downstream cmake projects. This is due to two reasons: The library and headers are not installed, and there is no cmake package configuration file.

Nowadays (with modern cmake) it is quite easy to generate cmake package configuration files that allow downstream projects to call find_package(libCZI <SOME VERSION>) to set all the include and link paths to use libCZI.

Could you kindly add cmake package configuration support and an install target?

CZIcmd: Colour Channel order reversed for 10 bit and 12 bit images.

I've been using CZIcmd lately and I've found it to be a really nice tool for automatically retrieving image data as it appears in Zen. Though I've found something strange happening when I give it images that were scanned with 10 bit or 12 bit colour. The H&E came out looking reddish, like this:

10bitexample1

I compared this with what I saw in Zen and it was clearly different:

10bitexample2

Anyway, long story short, I realised that the colour channels were in reverse order for some reason. So if I swapped the red and blue colour channels over then that fixed everything.

10bitexample3

I've not used libCZI directly, so I don't know if this is an issue with just CZIcmd or the underlying library.

Python bindings

Hello,

currently I am using openslide's python bindings to read and analyse parts of whole slide images from different vendors. Now we have got a larger number of .czi files. Do you have plans to add python bindings to libCZI?

Best regards,

Kai

libCZI static not properly building

When I try to build the static version of libCZI with Visual Studio on Windows, it seems to get built with __declspec(dllimport), which should only be used with the non-static dll version. This behavior is being controlled in ImportExport.h. I have found that if I manually define _STATICLIBBUILD as required by ImportExport.h, then the static version the lib is built correctly. I think there is a problem with the Visual Studio project files being generated by CMake not defining this constant when they should be.

ChannelComposite extraction using CZIcmd yields only half an image

I'm trying to extract the label-image into a more generic image format using the code below. An image
with correct dimensions is subtracted successfully, however half the image (the right-most part) is missing, or specifically, all pixels after pixel column #365 counting from the left is black (except for the blue channel which, curiously, continues for another column).

Am I doing something wrong here or may there be a bug?

$ CZIcmd -s CZIFILE.czi -c extractattachment -o tmp_czi_label_extract -e '{"name":"Label"}'
$ CZIcmd -s tmp_czi_label_extract_Label* -c printinformation

SubBlock-Statistics
-------------------

SubBlock-Count: 1

Bounding-Box:
 All:    X=0 Y=0 W=733 H=552
 Layer0: X=0 Y=0 W=733 H=552

M-Index: not valid

Bounds:
 C -> Start=0 Size=1

$ CZIcmd -c ChannelComposite -r 'abs(0,0,733,552)' -s tmp_czi_label_extract_Label* -o $1.label

Increase png image resolution

Hi there,

I am following 'creating multi-channel composite' example in docs to convert czi image file to png format (in mac os). In the end, I am getting an image with a lower resolution (compared to converted image from zen lite software for windows).

Is there a way to increase image resolution here? Your suggestions would be helpful.

Thanks.

Axio Scan Z1 support

Hi,

Does this library support the CZI-files produced from the Axio Scan Z1?

Thanks,
Jonas Øgaard

Multiple-scene overlapped area rendering

Hello,

I have a question regarding tile accessor to read multiple scene image. I have an image, sorry that I cannot share it. The tiles and scene is arranged as below figure. The red boundary is scene boundary, the blue area are the tiles and the green are tiles within overlapped area of 2 scene.

The issue I have is that CSingleChannelTileAccessor can render the green areas with tissue. However; when I use CSingleChannelPyramidLevelTileAccessor to render subsampled images. The green areas become background black pixels, which are copied from background of lower right scene.

I read the source code and, in the end, both classes call Compositors::ComposeSingleChannelTiles. I am wondering how it actually works here. How does the 2 methods determine which tile to render and why I got different results using these two classes.

Thank you.

image

[Request] Loading tiles/blocks by specifying the row, column tile location

Request:
Add function(s) to efficiently load a row, column tile/block at a specified zoom/pyramid level. In addition, code to get the tile/block size at a specified zoom/pyramid level, and the number of tiles/blocks along the row/column dimensions.

I am working on a project that will be traversing the entire image applying various filters and machine learning models on each block of data. After peaking through the code and documentation, I noticed two primary methods for getting at the data.
(1)
reader->ReadSubBlock(int blockIndex)

(2) Using regions of interest.

Both of these methods makes a call to reader->EnumerateSubBlocks to traverse the sub-blocks (including all pyramid levels) of the image. The region of interest function makes a call to reader->EnumerateSubBlocks for each ROI that is requested(!).

Ideally, I would like the have the following functions:

reader->getNumSubBlocksRow(int pyramidLevel)
reader->getNumSubBlocksCol(int pyramidLevel)
reader->getSubBlockDim(int pyramidLevel)
reader->getSubBlock(int row, int col, int pyramidLevel)

getNumSubBlocksRow and getNumSubBlocksCol would return the number of sub-blocks along the row or column dimension for a specified pyramid level, respectively.

getSubBlockDim would return the sub-block's dimensions at the specified pyramid level

getSubBlock would return a std::shared_ptr at the specified row, column, and pyramid level, within bounds of getNumSubBlocksRow and getNumSubBlocksCol.

To traverse the entire image I would then do the following:

  for (int row = 0; row < reader->getNumBlocksRow(PYRAMID_LEVEL); row++)
  {
    for (int col = 0; col < reader->getNumBlocksCol(PYRAMID_LEVEL; col++)
    {

       auto subBlock = reader->getSubBlock(row, col, pyramidLevel);

       ... do processing

    }
}

Missing/White tile on 5x and below resolution

I tried to dump czi image on zoom level 0.00390625000 with CZIcmd.exe
on lower resolution(below 10x ) tiles around scene-1 appearing as white tile. after 10x they are working fine

CZIcmd.exe --command SingleChannelScalingTileAccessor --plane-coordinate C0 --rect rel(0,0,90000,70000) --source "D:\images\czi\1-1-7A.czi" --output d:\out\czizmd --zoom 0.00390625000

CZIcmd output
czizmd

Snapshot from ZEN viewer(Expected output)
expectedImage

thread safety

the docs states that the lib aims to be thread-safe.

does this extend to reading the data from disk? i.e. is it supposed to be possible to use the same cziReader with an opened stream from multiple threads?

doing so gives Illegal data detected at offset 528800 -> Invalid SubBlockk-magic errors.

creating new cziReader objects with new streams in each thread avoids these errors, but incurs a considerable overhead.

Commercial use

Hi,

I'm super glad to see this library in the wild, thank you! I'm a developer of libbioimage and BisQue and we would like to get a much better support for your format. We do have commercial clients interested in using our code in the commercial setting and I wanted to know who should I talk to about commercial license for using libCZI.

Thank you very much,
Dmitry

how to free the bitmap?if I call it 10000,my cpu is 100%,my memory is 80%

my function :

`extern "C" _declspec(dllexport) void* GetRegionTile(const wchar_t* fileName, int64_t x, int64_t y, float _zoom, int64_t w, int64_t h, uint32_t* sourceRoiWidth, uint32_t* sourceRoiHeight, uint32_t* sourceRoiStride, uint64_t* sourceRoiSize, BYTE* ptrDataRoi)
{
auto stream = CreateStreamFromFile(fileName);
auto cziReader = CreateCZIReader();
cziReader->Open(stream);
auto statistics = cziReader->GetStatistics();
// get the display-setting from the document's metadata
auto mds = cziReader->ReadMetadataSegment();
auto md = mds->CreateMetaFromMetadataSegment();
auto docInfo = md->GetDocumentInfo();
auto dsplSettings = docInfo->GetDisplaySettings();
IntRect roi{ x,y,w,h };
// get the tile-composite for all channels (which are marked 'active' in the display-settings)
std::vector<shared_ptr> actvChBms;
int index = 0; // index counting only the active channels
std::map<int, int> activeChNoToChIdx; // we need to keep track which 'active channels" corresponds to which channel index
auto accessor = cziReader->CreateSingleChannelScalingTileAccessor();
CDisplaySettingsHelper::EnumEnabledChannels(dsplSettings.get(),
[&](int chIdx)->bool
{
CDimCoordinate planeCoord{ { DimensionIndex::C, chIdx } };
actvChBms.emplace_back(accessor->Get(roi, &planeCoord, _zoom, nullptr));
activeChNoToChIdx[chIdx] = index++;
return true;
});
// initialize the helper with the display-settings and provide the pixeltypes
// (for each active channel)
CDisplaySettingsHelper dsplHlp;
dsplHlp.Initialize(dsplSettings.get(),
[&](int chIdx)->PixelType { return actvChBms[activeChNoToChIdx[chIdx]]->GetPixelType(); });
// pass the tile-composites we just created (and the display-settings for the those active
// channels) into the multi-channel-composor-function
auto mcComposite = Compositors::ComposeMultiChannel_Bgr24(
dsplHlp.GetActiveChannelsCount(),
std::begin(actvChBms),
dsplHlp.GetChannelInfosArray());

auto bm = mcComposite.get();
	   
auto bitmapData = bm->Lock();

*sourceRoiWidth = bm->GetWidth();
*sourceRoiHeight = bm->GetHeight();

*sourceRoiStride = bitmapData.stride;
*sourceRoiSize = bitmapData.size;	

memcpy(ptrDataRoi, (BYTE*)bitmapData.ptrDataRoi, bitmapData.size);	
bm->Unlock();
return bitmapData.ptrDataRoi;

}`

I need to call it every time I take a 256*256 picture, call it many times, and use this method to consume my computer.
how to free them?

SingleChannelPyramidLevelTileAccessor throws when a matching pyramid level is not found

When SingleChannelPyramidLevelTileAccessor does not find any tiles that intersect the planeCoordinate, it simply does not populate the Bitmap; however, when it does not find any tiles at the correct pyramid level, it throws. Conceptually, these two cases seem the same, so I think the error should be handled the same way. I do not think the method should throw.

Wrong dimension T for AiryScan time series

libCZI 46cf2da reports the wrong time dimension size for a CZI file acquired on an LSM880 with AiryScan detector in time series mode using ZEN 2.3 software. The file contains 2 channels, 32 phases, and 10000000 time points (stored logically as 20000 x 500x1 images). The time dimension size is 20000 but is reported as 1 by libCZI:

CZIcmd.exe -s "Image 9.czi" -c PrintInformation -i All
SubBlock-Statistics
-------------------

SubBlock-Count: 198

Bounding-Box:
 All:    X=0 Y=0 W=500 H=1
 Layer0: X=0 Y=0 W=500 H=1

M-Index: not valid

Bounds:
 Z -> Start=0 Size=1
 C -> Start=0 Size=2
 T -> Start=0 Size=1
 H -> Start=0 Size=32
 V -> Start=0 Size=1
 B -> Start=0 Size=1

<?xml version="1.0"?>
<ImageDocument>
 <Metadata>
  <Version>1.0</Version>
  <Experiment>
   <ExperimentBlockIndex>0</ExperimentBlockIndex>
   <ExperimentBlocks>
    <AcquisitionBlock>
     <AcquisitionModeSetup>
      <BiDirectional>false</BiDirectional>
      <BiDirectionalZ>false</BiDirectionalZ>
      <BitsPerSample>16</BitsPerSample>
      <CameraBinning>1</CameraBinning>
      <CameraFrameHeight>1030</CameraFrameHeight>
      <CameraFrameOffsetX>0</CameraFrameOffsetX>
      <CameraFrameOffsetY>0</CameraFrameOffsetY>
      <CameraFrameWidth>1300</CameraFrameWidth>
      <CameraSuperSampling>0</CameraSuperSampling>
      <DimensionT>10000</DimensionT>
      <DimensionX>256</DimensionX>
      <DimensionY>256</DimensionY>
      <DimensionZ>1</DimensionZ>
      <FilterMethod>Average</FilterMethod>
      <FilterMode>Line</FilterMode>
      <FilterSamplingNumber>1</FilterSamplingNumber>
      <FitFramesizeToRoi>false</FitFramesizeToRoi>
      <HdrEnabled>false</HdrEnabled>
      <HdrImagingMode>0</HdrImagingMode>
      <HdrIntensity>1</HdrIntensity>
      <HdrNumFrames>1</HdrNumFrames>
      <InterpolationY>1</InterpolationY>
      <Objective>C-Apochromat 40x/1.2 W Korr FCS M27</Objective>
      <OffsetX>0</OffsetX>
      <OffsetY>0</OffsetY>
      <OffsetZ>0.013038284999999991</OffsetZ>
      <ReferenceZ>0.0046742540000000009</ReferenceZ>
      <PixelPeriod>2.4559999999999999e-006</PixelPeriod>
      <Rotation>0</Rotation>
      <AcquisitionMode>Point</AcquisitionMode>
      <RtBinning>1</RtBinning>
      <RtFrameHeight>512</RtFrameHeight>
      <RtFrameWidth>512</RtFrameWidth>
      <RtLinePeriod>3.0000000000000001e-005</RtLinePeriod>
      <RtOffsetX>0</RtOffsetX>
      <RtOffsetY>0</RtOffsetY>
      <RtRegionHeight>512</RtRegionHeight>
      <RtRegionWidth>512</RtRegionWidth>
      <RtSuperSampling>1</RtSuperSampling>
      <RtZoom>1</RtZoom>
      <ScalingX>0</ScalingX>
      <ScalingY>0</ScalingY>
      <ScalingZ>1e-008</ScalingZ>
      <SimRotations>3</SimRotations>
      <TimeSeries>true</TimeSeries>
      <TrackMultiplexType>Frame</TrackMultiplexType>
      <UseRois>false</UseRois>
      <ZoomX>40</ZoomX>
      <ZoomY>40</ZoomY>
      <PreScan>false</PreScan>
      <FocusStabilizer>false</FocusStabilizer>
      <ScannerOnlineCorrection>true</ScannerOnlineCorrection>
      <WaitState>false</WaitState>
      <FocalDistanceLsmTubeLense>138.40000000000001</FocalDistanceLsmTubeLense>
      <FocalDistanceStandardTubeLense>164.5</FocalDistanceStandardTubeLense>
      <FocalDistanceScanLense>52.5</FocalDistanceScanLense>
      <ApertureDiameter>4.4099999999999993</ApertureDiameter>
      <SamplingStart>0.5</SamplingStart>
      <SamplingEnd>0.5</SamplingEnd>
      <RequestedScanSpeed>1</RequestedScanSpeed>
     </AcquisitionModeSetup>
     <TimeSeriesSetup>
      <StartMode>
       <DigitalOut>-1</DigitalOut>
       <Manual />
      </StartMode>
      <StopMode>
       <DigitalOut />
       <Manual />
      </StopMode>
      <Switches>
       <Switch>
        <DigitalIn />
        <DigitalOut />
        <SwitchAction>
         <SetIntervalAction>
          <Interval>
           <TimeSpan>
            <Value>0</Value>
            <DefaultUnitFormat>ms</DefaultUnitFormat>
           </TimeSpan>
          </Interval>
         </SetIntervalAction>
        </SwitchAction>
       </Switch>
      </Switches>
     </TimeSeriesSetup>
     <ZStackSetup>
      <StackBrightnessCorrection>false</StackBrightnessCorrection>
      <StackBrightnessCorrections>
       <Positions />
       <Extrapolate>false</Extrapolate>
       <Interpolation>Cubic</Interpolation>
      </StackBrightnessCorrections>
     </ZStackSetup>
     <MultiTrackSetup>
      <TrackSetup Name="Track1">
       <Attenuators>
        <Attenuator>
         <Wavelength>4.8800000000000003e-007</Wavelength>
         <Transmission>0.0050000000000000001</Transmission>
         <LaserSuppression>false</LaserSuppression>
         <ExcitationIntensity>0</ExcitationIntensity>
         <Laser>ArgonRemote</Laser>
         <Polarization_Stokes0>1</Polarization_Stokes0>
         <Polarization_Stokes1>-1</Polarization_Stokes1>
         <Polarization_Stokes2>0</Polarization_Stokes2>
         <Polarization_Stokes3>0</Polarization_Stokes3>
        </Attenuator>
       </Attenuators>
       <BeamSplitters>
        <BeamSplitter>
         <Identifier>MainBeamSplitterDescanned1</Identifier>
         <Filter>MBS 488/561</Filter>
         <BeamSplitterServoPosition>0</BeamSplitterServoPosition>
        </BeamSplitter>
        <BeamSplitter>
         <Identifier>MainBeamSplitterDescanned2</Identifier>
         <Filter>MBS -405/760+</Filter>
         <BeamSplitterServoPosition>0</BeamSplitterServoPosition>
        </BeamSplitter>
        <BeamSplitter>
         <Identifier>DichroicBeamSplitterDescanned1</Identifier>
         <Filter>Plate</Filter>
         <BeamSplitterServoPosition>0</BeamSplitterServoPosition>
        </BeamSplitter>
        <BeamSplitter>
         <Identifier>MainBeamSplitterNonDescanned</Identifier>
         <Filter>Rear</Filter>
         <BeamSplitterServoPosition>0</BeamSplitterServoPosition>
        </BeamSplitter>
       </BeamSplitters>
       <BleachSetup>
        <BleachParameterSets>
         <BleachParameterSet>
          <StartEvent>None</StartEvent>
          <EndEvent>Number</EndEvent>
          <StartTime>0</StartTime>
          <StartNumber>1</StartNumber>
          <Duration>0</Duration>
          <Cycles>1</Cycles>
          <TriggerIn>0</TriggerIn>
          <TriggerOut>0</TriggerOut>
          <Repeat>0</Repeat>
          <DifferentSpotPosition>false</DifferentSpotPosition>
          <SimultanGrabAndBleach>false</SimultanGrabAndBleach>
          <SpotPositionX>0</SpotPositionX>
          <SpotPositionY>8.7825189999999929e-008</SpotPositionY>
          <PositionZ>0</PositionZ>
          <PixelPeriod>-1</PixelPeriod>
          <StopAtIntensityDrop>false</StopAtIntensityDrop>
          <IntensityDrop>0.5</IntensityDrop>
         </BleachParameterSet>
        </BleachParameterSets>
       </BleachSetup>
       <Collimators>
        <Collimator>
         <Name>LSMCOLLI_NLO</Name>
         <Position>2942</Position>
        </Collimator>
        <Collimator>
         <Name>LSMCOLLI_V</Name>
         <Position>693</Position>
        </Collimator>
       </Collimators>
       <Detectors>
        <Detector Name="Airyscan" Id="831012323125198510614351197952380055650">
         <DetectorIdentifier>AiryScan1</DetectorIdentifier>
         <PureRatioSource>false</PureRatioSource>
         <ImageChannelName>ChA</ImageChannelName>
         <Voltage>750</Voltage>
         <AmplifierGain>1</AmplifierGain>
         <AmplifierOffset>0</AmplifierOffset>
         <PinholeDiameter>7.9911200000000002e-005</PinholeDiameter>
         <SpectralScanChannels>32</SpectralScanChannels>
         <Dye />
         <Folder />
         <Palette>LsmDetectorPalette_0_0</Palette>
         <Color>#00FF00</Color>
         <DetectorMode>Integration</DetectorMode>
         <DigitalGain>1</DigitalGain>
         <DigitalOffset>0</DigitalOffset>
         <LaserSuppression>true</LaserSuppression>
         <Filtersets>
          <Filterset>Plate</Filterset>
         </Filtersets>
         <AiryScanMode>SuperResolution</AiryScanMode>
         <AiryScanVirtualPinholeSize>3.9955600000000001e-005</AiryScanVirtualPinholeSize>
         <AiryScanMagnification>1050.834975092725</AiryScanMagnification>
         <AiryScanTransformationXX>0.8719337478123339</AiryScanTransformationXX>
         <AiryScanTransformationXY>0.48962387546558356</AiryScanTransformationXY>
         <AiryScanTransformationYX>-0.48962387546558356</AiryScanTransformationYX>
         <AiryScanTransformationYY>0.8719337478123339</AiryScanTransformationYY>
        </Detector>
       </Detectors>
       <CenterWavelength>5.5259966400000006e-007</CenterWavelength>
       <CondensorFrontlensPosition>-1</CondensorFrontlensPosition>
       <CondensorRevolverFilter>HF</CondensorRevolverFilter>
       <TubeLensPosition>Lens LSM</TubeLensPosition>
       <FieldStopPosition>-1</FieldStopPosition>
       <CondensorAperture>0.55000000000000004</CondensorAperture>
       <FilterTransmission>-1</FilterTransmission>
       <CameraIntegrationTime>2.4559999999999999e-006</CameraIntegrationTime>
       <DeviceMode>LSM_ChannelMode</DeviceMode>
       <TransmittedLightLampIntensity>0</TransmittedLightLampIntensity>
       <ReflectedLightLampIntensity>-1</ReflectedLightLampIntensity>
       <LaserSuppressionMode>None</LaserSuppressionMode>
       <TirfAngle>0</TirfAngle>
       <PalmSlider>true</PalmSlider>
       <SimGratingPeriod>0</SimGratingPeriod>
       <FWLive405Position />
       <FWFOVPosition />
      </TrackSetup>
     </MultiTrackSetup>
     <TilesSetup>
      <PositionGroups>
       <PositionGroup>
        <AutoFocusMode>Off</AutoFocusMode>
        <AutoFocusOffset>0</AutoFocusOffset>
       </PositionGroup>
      </PositionGroups>
     </TilesSetup>
     <Lasers>
      <Laser>
       <LaserPower>0.050000000000000003</LaserPower>
       <LaserName>Titanium:Sapphire</LaserName>
      </Laser>
      <Laser>
       <LaserPower>0.023000000000000003</LaserPower>
       <LaserName>ArgonRemote</LaserName>
      </Laser>
     </Lasers>
    </AcquisitionBlock>
   </ExperimentBlocks>
  </Experiment>
  <CustomAttributes>
   <LsmTag>&lt;LsmTag Name="CarlZeissAim.IncubatorState.Switch_TempChannel4" Type="boolean"&gt;false&lt;/LsmTag&gt;</LsmTag>
  </CustomAttributes>
  <Information>
   <Measurement>
    <BaseValues>
     <ImageBaseTime0>0001-01-01T00:00:00-08:00</ImageBaseTime0>
     <ImageBaseTime1>0001-01-01T00:00:00-08:00</ImageBaseTime1>
     <ImageBaseTime2>0001-01-01T00:00:00-08:00</ImageBaseTime2>
     <ImageBaseTime3>0001-01-01T00:00:00-08:00</ImageBaseTime3>
     <ImageBaseTime4>0001-01-01T00:00:00-08:00</ImageBaseTime4>
    </BaseValues>
   </Measurement>
   <User Id="0">
    <DisplayName>xxxxxxx</DisplayName>
   </User>
   <Application>
    <Name>AIMApplication</Name>
    <Version>14.0.0.201</Version>
   </Application>
   <Document>
    <Name>Image 9</Name>
    <Description />
    <Comment />
    <UserName>xxxxx</UserName>
    <CreationDate>2017-09-05T20:13:15.3680854-07:00</CreationDate>
    <SubType>Point</SubType>
    <Rating>0</Rating>
    <Title>Image 9</Title>
   </Document>
   <Image>
    <OriginalScanData>true</OriginalScanData>
    <PixelType>Gray16</PixelType>
    <ComponentBitCount>16</ComponentBitCount>
    <SizeX>500</SizeX>
    <SizeT>20000</SizeT>
    <SizeC>2</SizeC>
    <SizeH>32</SizeH>
    <SizeY>1</SizeY>
    <SizeZ>1</SizeZ>
    <SizeB>1</SizeB>
    <SizeV>1</SizeV>
    <OriginalCompressionMethod>Uncompressed</OriginalCompressionMethod>
    <OriginalEncodingQuality>100</OriginalEncodingQuality>
    <Dimensions>
     <Channels>
      <Channel Id="831012323125198510614351197952380055650" Name="ChA">
       <IlluminationType>Epifluorescence</IlluminationType>
       <ContrastMethod>Fluorescence</ContrastMethod>
       <PinholeSizeAiry>2.1475732330018813</PinholeSizeAiry>
       <ExcitationWavelength>488.00000000000006</ExcitationWavelength>
       <EmissionWavelength>488.00000000000006</EmissionWavelength>
       <ChannelType>AiryScanRawSr</ChannelType>
       <FilterSet Id="FilterSet:0:0:0" />
       <PixelType>Gray8</PixelType>
       <AcquisitionMode>LaserScanningConfocalMicroscopy</AcquisitionMode>
       <DetectionWavelength />
       <DetectorSettings>
        <Binning>1x1</Binning>
        <PhotonConversionFactor>0</PhotonConversionFactor>
        <Gain>750</Gain>
        <DigitalGain>1</DigitalGain>
        <Offset>0</Offset>
        <Detector Id="Detector:0:0" />
       </DetectorSettings>
       <LightSourcesSettings>
        <LightSourceSettings>
         <Attenuation>0.995</Attenuation>
         <Wavelength>488.00000000000006</Wavelength>
         <Polarization>
          <StokesParameter1>1</StokesParameter1>
          <StokesParameter2>-1</StokesParameter2>
          <StokesParameter3>0</StokesParameter3>
          <StokesParameter4>0</StokesParameter4>
         </Polarization>
         <LightSource Id="LightSource:1" />
        </LightSourceSettings>
       </LightSourcesSettings>
       <LaserScanInfo>
        <PixelTime>2.4559999999999999e-006</PixelTime>
        <ZoomX>40</ZoomX>
        <ZoomY>40</ZoomY>
        <SampleRotation>0</SampleRotation>
        <SampleOffsetX>0</SampleOffsetX>
        <SampleOffsetY>0</SampleOffsetY>
        <LineTime>3.0000000000000001e-005</LineTime>
        <FrameTime>2.4559999999999999e-006</FrameTime>
        <ScanningMode>Frame</ScanningMode>
        <Averaging>1</Averaging>
       </LaserScanInfo>
       <AiryscanSettings>
        <Mode>SuperResolution</Mode>
        <VirtualPinholeSize>3.99556E-05</VirtualPinholeSize>
        <Magnification>1050.834975092725</Magnification>
        <TransformationXX>0.8719337478123339</TransformationXX>
        <TransformationXY>0.48962387546558356</TransformationXY>
        <TransformationYX>-0.48962387546558356</TransformationYX>
        <TransformationYY>0.8719337478123339</TransformationYY>
       </AiryscanSettings>
      </Channel>
      <Channel Id="Channel:1">
       <PixelType>Gray8</PixelType>
      </Channel>
     </Channels>
     <Tracks>
      <Track Id="Track:0">
       <ChannelRefs>
        <ChannelRef Id="831012323125198510614351197952380055650" />
       </ChannelRefs>
      </Track>
     </Tracks>
     <T>
      <StartTime>0001-01-01T00:00:00</StartTime>
      <Positions>
       <BinaryList>
        <AttachmentName>TimeStamps</AttachmentName>
       </BinaryList>
      </Positions>
     </T>
     <S>
      <Scenes>
       <Scene Index="0">
        <ScanMode>Meander</ScanMode>
        <Positions>
         <Position X="7832.06" Y="-14930.3" Z="4674.26" />
        </Positions>
       </Scene>
      </Scenes>
     </S>
    </Dimensions>
    <ObjectiveSettings>
     <Medium>Water</Medium>
     <RefractiveIndex>1.333</RefractiveIndex>
     <ObjectiveRef Id="Objective:0" />
    </ObjectiveSettings>
    <MicroscopeRef Id="Microscope:0" />
   </Image>
   <Instrument Id="Instrument:0">
    <Microscopes>
     <Microscope Id="Microscope:0">
      <System>LSM 880, AxioObserver</System>
     </Microscope>
    </Microscopes>
    <LightSources>
     <LightSource Id="LightSource:0">
      <Power>50</Power>
      <Manufacturer>
       <Model>Titanium:Sapphire</Model>
      </Manufacturer>
      <LightSourceType>
       <Laser>
        <Wavelength>740.000000</Wavelength>
       </Laser>
      </LightSourceType>
     </LightSource>
     <LightSource Id="LightSource:1">
      <Power>23.000000000000004</Power>
      <Manufacturer>
       <Model>ArgonRemote</Model>
      </Manufacturer>
      <LightSourceType>
       <Laser>
        <Wavelength>458.000000</Wavelength>
       </Laser>
      </LightSourceType>
     </LightSource>
    </LightSources>
    <Detectors>
     <Detector Id="Detector:0:0">
      <Gain>1</Gain>
      <Zoom>1</Zoom>
      <AmplificationGain>1</AmplificationGain>
      <Type>Airyscan</Type>
      <Manufacturer>
       <Model />
      </Manufacturer>
     </Detector>
    </Detectors>
    <Objectives>
     <Objective Id="Objective:0">
      <Immersion>Water</Immersion>
      <LensNA>1.2000000000000002</LensNA>
      <NominalMagnification>40</NominalMagnification>
      <Manufacturer>
       <Model>C-Apochromat 40x/1.2 W Korr FCS M27</Model>
      </Manufacturer>
     </Objective>
    </Objectives>
    <FilterSets>
     <FilterSet Id="FilterSet:0:0:0">
      <EmissionFilters>
       <EmissionFilterRef Id="Filter:0:0:0" />
      </EmissionFilters>
     </FilterSet>
    </FilterSets>
    <Filters>
     <Filter Id="Filter:0:0:0" Name="Plate" />
    </Filters>
   </Instrument>
   <Processing>
    <Airyscan>
     <Channels>
      <Channel>
       <SuperResolutionParameter>0</SuperResolutionParameter>
       <ParameterEstimationType>Manual</ParameterEstimationType>
       <DeconvolutionType>2D</DeconvolutionType>
       <IsTileBased>false</IsTileBased>
       <VirtualPinholeParameter>0</VirtualPinholeParameter>
       <BaselineShift>false</BaselineShift>
       <BaselineShiftParameter>0</BaselineShiftParameter>
      </Channel>
      <Channel>
       <SuperResolutionParameter>0</SuperResolutionParameter>
       <ParameterEstimationType>Manual</ParameterEstimationType>
       <DeconvolutionType>2D</DeconvolutionType>
       <IsTileBased>false</IsTileBased>
       <VirtualPinholeParameter>0</VirtualPinholeParameter>
       <BaselineShift>false</BaselineShift>
       <BaselineShiftParameter>0</BaselineShiftParameter>
      </Channel>
     </Channels>
    </Airyscan>
   </Processing>
  </Information>
  <Scaling>
   <AutoScaling>
    <Type>Measured</Type>
    <CreationDateTime>09/06/2017 04:00:32</CreationDateTime>
   </AutoScaling>
   <Items>
    <Distance Id="X">
     <Value>0</Value>
    </Distance>
    <Distance Id="Y">
     <Value>0</Value>
    </Distance>
    <Distance Id="Z">
     <Value>0</Value>
    </Distance>
    <Pixel Id="T">
     <Value>1</Value>
    </Pixel>
   </Items>
  </Scaling>
  <DisplaySetting>
   <Channels>
    <Channel Id="831012323125198510614351197952380055650" Name="ChA">
     <Low>0.0030060273136491961</Low>
     <High>0.15414663920042718</High>
     <BitCountRange>16</BitCountRange>
     <PixelType>Gray16</PixelType>
     <DyeName>Dye1</DyeName>
     <DyeMaxEmission>488.00000000000006</DyeMaxEmission>
     <DyeMaxExcitation>488.00000000000006</DyeMaxExcitation>
     <Color>#FF00FF00</Color>
     <OriginalColor>#FF00FF00</OriginalColor>
     <ChannelUnit>
      <FactorI>1</FactorI>
      <OffsetI>0</OffsetI>
      <UnitI>Unknown</UnitI>
      <ChannelType>AiryScanRawSr</ChannelType>
     </ChannelUnit>
    </Channel>
    <Channel Id="3357350662128558537140425115101775084003" Name="ChA#">
     <Low>0.0030060273136491961</Low>
     <High>0.0854319939869825</High>
     <Gamma>0.0099999999999997868</Gamma>
     <BitCountRange>16</BitCountRange>
     <PixelType>Gray16</PixelType>
     <DyeName>Dye2</DyeName>
     <Color>#FF00FF00</Color>
     <OriginalColor>#FF00FF00</OriginalColor>
     <IsSelected>false</IsSelected>
     <ChannelUnit>
      <FactorI>1</FactorI>
      <OffsetI>0</OffsetI>
      <UnitI>Unknown</UnitI>
      <ChannelType>AiryScanSum</ChannelType>
     </ChannelUnit>
    </Channel>
   </Channels>
  </DisplaySetting>
  <Layers />
  <Appliances>
   <Appliance Id="ShuttleAndFind:1">
    <Data>
     <ShuttleAndFindData>
      <Calibration>
       <MicroscopeType>LM</MicroscopeType>
       <Markers>
        <Marker Id="Marker:1" StageXPosition="0" StageYPosition="0" FocusPosition="0" />
        <Marker Id="Marker:2" StageXPosition="0" StageYPosition="0" FocusPosition="0" />
        <Marker Id="Marker:3" StageXPosition="0" StageYPosition="0" FocusPosition="0" />
       </Markers>
       <StageOrientation X="1" Y="1" />
      </Calibration>
     </ShuttleAndFindData>
    </Data>
   </Appliance>
  </Appliances>
 </Metadata>
</ImageDocument>

Scaling-Information
-------------------

 (the numbers give the length of one pixel (in the respective direction) in the unit 'meter')

ScaleX=0
ScaleY=0
ScaleZ=0

General Information
-------------------

Name=Image 9
Title=Image 9
UserName=xxxxxx
Description=
Comment=
Keywords=
Rating=0
CreationDate=2017-09-05T20:13:15.3680854-07:00

Display-Settings
----------------

Channel #0
==========
 Enabled: yes
 Tinting: yes (R=0, G=255, B=0)
 Black-point: 0.00300603  White-point: 0.154147
 Gradation-curve-mode: linear

Channel #1
==========
 Enabled: no
 Tinting: yes (R=0, G=255, B=0)
 Black-point: 0.00300603  White-point: 0.085432
 Gradation-curve-mode: gamma (0.01)

Display-Settings in CZIcmd-JSON-Format
--------------------------------------


Pretty-Print:
{
    "channels": [
        {
            "ch": 0,
            "black-point": 0.0030060273129493,
            "white-point": 0.15414664149284364,
            "tinting": "#00ff00"
        }
    ]
}

Compact:
{"channels":[{"ch":0,"black-point":0.0030060273129493,"white-point":0.15414664149284364,"tinting":"#00ff00"}]}
Complete list of sub-blocks
---------------------------

#0: Z0C0T0H0V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#1: Z0C0T0H1V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#2: Z0C0T0H2V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#3: Z0C0T0H3V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#4: Z0C0T0H4V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#5: Z0C0T0H5V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#6: Z0C0T0H6V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#7: Z0C0T0H7V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#8: Z0C0T0H8V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#9: Z0C0T0H9V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#10: Z0C0T0H10V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#11: Z0C0T0H11V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#12: Z0C0T0H12V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#13: Z0C0T0H13V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#14: Z0C0T0H14V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#15: Z0C0T0H15V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#16: Z0C0T0H16V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#17: Z0C0T0H17V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#18: Z0C0T0H18V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#19: Z0C0T0H19V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#20: Z0C0T0H20V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#21: Z0C0T0H21V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#22: Z0C0T0H22V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#23: Z0C0T0H23V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#24: Z0C0T0H24V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#25: Z0C0T0H25V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#26: Z0C0T0H26V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#27: Z0C0T0H27V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#28: Z0C0T0H28V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#29: Z0C0T0H29V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#30: Z0C0T0H30V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#31: Z0C0T0H31V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
#32: Z0C1T0H0V0B0 M=-2147483648 logical=(0,0,500,1) phys.=(500,1) pixeltype=gray16
Attachment Info
---------------

count | name
------+----------------------------
    1 | EventList
    1 | FiberMatrix
    1 | LookupTables
    1 | Thumbnail
    1 | TimeStamps
Complete list of Attachments
----------------------------

index | filetype | GUID                                   | name
------+----------+----------------------------------------+-------------
    0 | JPG      | {A64C56B1-44E1-464C-8E6A-D11021362769} | Thumbnail
    1 | CZLUT    | {8DE7B4A7-A314-4C5F-8413-23B4A8851B4C} | LookupTables
    2 | CZTIMS   | {78D90040-ABEA-4574-99FB-4E65CED742F2} | TimeStamps
    3 | CZEVL    | {3A768E05-B3A3-4860-A438-FC8C3400C18F} | EventList
    4 | CZFBMX   | {4A518ED9-B773-4E85-A829-128AFA4228C2} | FiberMatrix
Pyramid-Subblock-Statistics
---------------------------

 number of subblocks with scale 1/1: 33

Commercial license

Hello,

I see that this project is licensed under GPL. Is there an alternate commercial license available for distribution with proprietary software?

Cheers,
Thomas

Reading Attachments

Newer versions of ZEN embed the scan profile name as an attachment

<AttachmentInfos>
 <AttachmentInfo Id="Label:1">
  <Label>
   <Barcodes>
    <Barcode Id="Barcode:1">
     <Type>Type: DataMatrix
lue: 071140J
ientation: Top To Bottom
gle: 94.080002
ror Correction Level: 0
m Errors Corrected: 0
mension: 12x12
Type>
     <Content>071140J</Content>
    </Barcode>
   </Barcodes>
   <OCRs>
    <OCR Id="OCR:1">
     <Content />
    </OCR>
   </OCRs>
  </Label>
  <Profile>
   <ProfileName>Matsunami_10X_ER_CLC_v1.0.0.czspf</ProfileName>
   <IsProfileModified>False</IsProfileModified>
  </Profile>
 </AttachmentInfo>
</AttachmentInfos>

I'm not sure how I'm expected to read the value Matsunami_10X_ER_CLC_v1.0.0.czspf. I can find the attachment itself no problem, but ReadAttachment returns a ~37KB blob (!). It says the file type is "Zip-Comp", but it sure doesn't appear to be a zip archive, and why would it be?

reader->EnumerateSubset(nullptr, "Profile", [&](int index, const libCZI::AttachmentInfo& info)->bool {	
	auto attachment = reader->ReadAttachment(index);
	size_t sz = 0;
	auto data = attachment->GetRawData(&sz);
        // do stuff

	return false;		
});

The docs aren't clear here (just auto generated stuff). All I want is the ProfileName value. It appears as though these chunks of XML are just pointers to an actual file in the CZI, but really... I just want that metadata.

I realize that I can parse the XML myself, but is there a nicer/more robust way to extract the data here? You'd think it would come with the attachment info object, but I don't see it.

Just out of curiosity... If I use cziCMD to extract the attachment it adds a Zip-Comp extension. What is a Zip-Comp file?!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.