Newer
Older
return ((header.filePart == 0) && (header.fileGuid == header.masterFileGuid));
void print_segment_header(const SegmentHeader &segmentHeader)
{
printf("---------SegmentHeader---------\n");
printf("%-25s %15s\n", "SID", segmentHeader.sId.c_str());
printf("%-25s %15li\n", "AllocatedSize", segmentHeader.allocatedSize);
printf("%-25s %15li\n", "UsedSize", segmentHeader.usedSize);
printf("-------------------------------\n");
}
const char *pixel_type_str(const PixelType px)
{
switch (px)
{
case PixelType::Gray8:
return "Gray8";
case PixelType::Gray16:
return "Gray16";
case PixelType::Gray32Float:
return "Gray32Float";
case PixelType::Bgr24:
return "Bgr24";
case PixelType::Bgr48:
return "Bgr48";
case PixelType::Bgr96Float:
return "Bgr96Float";
case PixelType::Bgra32:
return "Bgra32";
case PixelType::Gray64ComplexFloat:
return "Gray64ComplexFloat";
case PixelType::Bgr192ComplexFloat:
return "Bgr192ComplexFloat";
case PixelType::Gray32:
return "Gray32";
case PixelType::Gray64:
return "Gray64";
default:
always_assert("Bad pixel type." && false);
return nullptr;
}
const char *pyramid_type_str(const PyramidType pt)
{
switch (pt)
{
case PyramidType::None:
return "None";
case PyramidType::SingleSubBlock:
return "SingleSubBlock";
case PyramidType::MultiSubBlock:
return "MultiSubBlock";
break;
default:
{
always_assert("Bad pyramid type." && false);
return nullptr;
}
const char *compression_type_str(const CompressionType ct)
{
switch (ct)
{
case CompressionType::Uncompressed:
return "Uncompressed";
case CompressionType::LZW:
return "LZW";
case CompressionType::JpgFile:
return "JpgFile";
case CompressionType::JpegXrFile:
return "JpegXrFile";
case CompressionType::Camera:
return "Camera";
case CompressionType::System:
return "System";
break;
default:
{
always_assert("Bad compression type." && false);
return nullptr;
{
switch (d)
{
case Dimension::X:
return "X (width)";
return "Y (height)";
return "C (channels)";
return "Z (Z-slices)";
return "T (timestamps)";
return "R (rotation)";
return "S (scene)";
return "I (illumination)";
return "B (block index)";
return "M (mosaic)";
return "H (phase)";
return "V (views)";
break;
default:
{
always_assert("Bad dimension type." && false);
return nullptr;
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
switch (d)
{
case Dimension::X:
return "X";
case Dimension::Y:
return "Y";
case Dimension::C:
return "C";
case Dimension::Z:
return "Z";
case Dimension::T:
return "T";
case Dimension::R:
return "R";
case Dimension::S:
return "S";
case Dimension::I:
return "I";
case Dimension::B:
return "B";
case Dimension::M:
return "M";
case Dimension::H:
return "H";
case Dimension::V:
return "V";
break;
default:
{
always_assert("Bad dimension type." && false);
break;
}
}
return "";
}
std::string dimension_stack_str(const std::vector<DimensionEntryDV1> &dims, bool includeSize)
{
std::string result;
for (const DimensionEntryDV1 &entry : dims)
{
result.append(dimension_char(entry.dimension) + (includeSize ? ("(" + std::to_string(entry.size) + ")-") : ""));
}
return includeSize ? result.substr(0, result.length() - 1) : result;
}
void CziFile::report_verbose() const
{
printf("==========SubBlock directory==========\n");
print_segment_header(subBlockDirectory.header);
printf("%-25s %15i\n", "EntryCount", subBlockDirectory.entryCount);
for (size_t entry = 0; entry < subBlockDirectory.entryCount; entry++)
{
printf("SubBlockId: %i\tPixelType: %s\tCompression: %s\tDimensionStack: %s\tPyramidType: %s\n",
(int)entry,
pixel_type_str(subBlockDirectory.entries[entry].pixelType),
compression_type_str(subBlockDirectory.entries[entry].compression),
dimension_stack_str(subBlockDirectory.entries[entry].dimensions, true).c_str(),
pyramid_type_str(subBlockDirectory.entries[entry].pyramidType));
// printf("-------SubBlock directory entry %i-------\n", (int)entry);
// printf("%-25s %15s\n", "PixelType", pixel_type_str(subBlockDirectory.entries[entry].pixelType));
// printf("%-25s %15li\n", "FilePosition", subBlockDirectory.entries[entry].filePosition);
// printf("%-25s %15i\n", "FilePart", subBlockDirectory.entries[entry].filePart);
// printf("%-25s %15s\n", "Compression", compression_type_str(subBlockDirectory.entries[entry].compression));
// printf("%-25s %15s\n", "PyramidType", pyramid_type_str(subBlockDirectory.entries[entry].pyramidType));
// printf("%-25s %15i\n", "DimensionCount", subBlockDirectory.entries[entry].dimensionCount);
// for (size_t dim = 0; dim < subBlockDirectory.entries[entry].dimensionCount; dim++)
// {
// printf("-------SubBlock %i dimension %i-------\n", (int)entry, (int)dim);
// printf("%-25s %15s\n", "Dimension", dimension_type_str(subBlockDirectory.entries[entry].dimensions[dim].dimension));
// printf("%-25s %15i\n", "Start", subBlockDirectory.entries[entry].dimensions[dim].start);
// printf("%-25s %15i\n", "Size", subBlockDirectory.entries[entry].dimensions[dim].size);
// printf("%-25s %15i\n", "StoredSize", subBlockDirectory.entries[entry].dimensions[dim].storedSize);
// }
// printf("-----------------------------------------\n");
}
printf("======================================\n");
std::string byte_array_str(const std::vector<byte> &bytes)
{
std::string result = "";
for (size_t i = 0; i < bytes.size(); i++)
{
result.append(std::to_string(bytes[i]));
if (i % 4 == 0 && i != bytes.size() - 1)
result.append("-");
}
return result;
}
{
printf("Loaded CZI FILE: %s\n", fileName.c_str());
printf("==========Summary report==========\n");
print_segment_header(header.header);
printf("%-25s %13i.%i\n", "FileVersion", header.fileVersion.major, header.fileVersion.minor);
printf("%-25s %15i\n", "FilePart", header.filePart);
printf("%-25s %30s\n", "MasterGUID", byte_array_str(header.masterFileGuid).c_str());
printf("%-25s %30s\n", "FileGUID", byte_array_str(header.masterFileGuid).c_str());
//TODO: Replace with GUID print.
printf("%-25s %15i\n", "GUIDs are matching", are_same_vectors(header.masterFileGuid, header.fileGuid));
printf("%-25s %15i\n", "UpdatePending", header.updatePending);
printf("%-25s %15li\n", "SubblockDirPosition", header.subBlockDirectoryPosition);
printf("%-25s %15li\n", "MetadataPosition", header.metadataPosition);
printf("%-25s %15li\n", "AttachmentDirPosition", header.attachmentDirectoryPosition);
printf("%-25s %15i\n", "SubBlockCount", subBlockDirectory.entryCount);
printf("%-25s %15i\n", "AttachmentCount", attachmentDirectory.entryCount);
{
std::map<PixelType, int> pixelTypeMap;
std::map<CompressionType, int> compressionMap;
std::map<std::string, int> dimensionMap;
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
for (size_t sbId = 0; sbId < subBlockDirectory.entryCount; sbId++)
{
const DirectoryEntryDV entry = subBlockDirectory.entries[sbId];
if (pixelTypeMap.count(entry.pixelType))
pixelTypeMap[entry.pixelType]++;
else
pixelTypeMap.emplace(std::make_pair(entry.pixelType, 1));
if (compressionMap.count(entry.compression))
compressionMap[entry.compression]++;
else
compressionMap.emplace(std::make_pair(entry.compression, 1));
std::string dimStackStr = dimension_stack_str(entry.dimensions, false);
if (dimensionMap.count(dimStackStr))
dimensionMap[dimStackStr]++;
else
dimensionMap.emplace(std::make_pair(dimStackStr, 1));
}
printf("Pixel type distribution:\n");
for (auto &&ptPair : pixelTypeMap)
{
printf("\t%s %ix\n", pixel_type_str(ptPair.first), ptPair.second);
}
printf("Compression type distribution:\n");
for (auto &&ctPair : compressionMap)
{
printf("\t%s %ix\n", compression_type_str(ctPair.first), ctPair.second);
}
printf("Dimension stack distribution:\n");
for (auto &&dimPair : dimensionMap)
{
printf("\t%s %ix\n", dimPair.first.c_str(), dimPair.second);
}
}
//printf("%-25s %15i\n", "DimensionCount", subBlockDirectory.entries[0].dimensionCount);
//printf("%-25s %15s\n", "PixelType", pixel_type_str(subBlockDirectory.entries[0].pixelType));
}
printf("==================================\n");
void CziFile::extract_images(const std::string &baseName) const
{
BinaryFileStream cziStream(fileName);
int imageIndex = 0;
for (const DirectoryEntryDV &entry : subBlockDirectory.entries)
{
always_assert(entry.width > 0 && entry.height > 0);
auto imageBytes = cziStream.move_and_consume_bytes(entry.subBlock.dataLocation, entry.subBlock.dataSize);
std::string imageFileName = baseName + std::to_string(imageIndex++) + ".pnm";
create_image_file(imageFileName.c_str(), imageBytes, entry.pixelType, entry.width, entry.height);
}
}
void CziFile::dump_image_data(const std::string &baseName) const
{
BinaryFileStream cziStream(fileName);
int imageIndex = 0;
for (const DirectoryEntryDV &entry : subBlockDirectory.entries)
{
always_assert(entry.width > 0 && entry.height > 0);
std::string binaryFileName = baseName + std::to_string(imageIndex++) + ".bin";
auto imageBytes = cziStream.move_and_consume_bytes(entry.subBlock.dataLocation, entry.subBlock.dataSize);
std::ofstream binaryStream(binaryFileName, std::ios::binary | std::ios::out);
always_assert(binaryStream.is_open());
binaryStream.write(reinterpret_cast<const char *>(imageBytes.data()), imageBytes.size());
printf("Wrote %s\n", binaryFileName.c_str());
}
}