TEST(Test1, pngReadsFromFileMemoryAllocatedByPngReader) { std::cout << "########## Image file read (using high-level PNG API) via inputstream; memory allocated by PngReader" << std::endl; Chrono chrono; IOUtils ioUtuls; ioUtuls.readFile(IMAGE1); MemoryPngInputStream memoryInputstream( (const png_bytep) ioUtuls.getBuffer(), (const png_size_t) ioUtuls.getLength()); std::cout << "Image read info memory in " << chrono.elapsedTimeInMs() << " ms" << std::endl; chrono.reset(); PngReader pngReader1; { pngReader1.readFromInputstream(memoryInputstream); std::cout << "Image read from input stream in " << chrono.elapsedTimeInMs() << " ms" << std::endl; } chrono.reset(); PngReader pngReader2; { memoryInputstream.reset(); pngReader2.readFromInputstream(memoryInputstream, true); std::cout << "Image read from input stream in " << chrono.elapsedTimeInMs() << " ms" << std::endl; } AssertUtil::equals(pngReader1, pngReader2); }
int main(int argc, char **argv) { if (argc < 2) { std::cout << "Usage: pgn-app png-in" << std::endl; return 1; } Chrono chrono; chrono.reset(); IOUtils png; png.readFile(argv[1]); MemoryPngInputStream memoryInputstream((const png_bytep) png.getBuffer(), (const png_size_t) png.getLength()); std::cout << "Image read info memory in " << chrono.elapsedTimeInMs() << " ms" << std::endl; { chrono.reset(); PngReader rdrMem; memoryInputstream.reset(); rdrMem.readFromInputstream(memoryInputstream, true); std::cout << "Image read memory (own alloc)in " << chrono.elapsedTimeInMs() << " ms" << std::endl; } chrono.reset(); PngReader rdrMem; memoryInputstream.reset(); rdrMem.readFromInputstream(memoryInputstream); std::cout << "Image read memory (pnglib alloc) in " << chrono.elapsedTimeInMs() << " ms" << std::endl; PngData pngData(rdrMem.getWidth(), rdrMem.getHeight(), rdrMem.getBitDepth(), rdrMem.getColorType(), rdrMem.getPixelDataRowPointers()); std::cout << "Nr of bytes pixelData=" << pngData.getNrOfBytesPixelData() << std::endl; // Loop to see if having a preallocated buffer works better. Answer: yes // Saving was 0-20 ms (on VM on Laptop: (windows7,[email protected] ghz, 8gb) const uint32_t estimatedPngHeaderSize = 1024 * 8; for (int j = 0; j < 10; j++) { for (uint32_t i = 0; i < 2; i++) { uint32_t outputBufferSize = pngData.getNrOfBytesPixelData() + estimatedPngHeaderSize; MemoryPngOutputStream memOs(i * outputBufferSize); chrono.reset(); PngWriter writer(pngData); writer.writePngToOutputStream(memOs); std::cout << "Iteration: " << i << ", image write png to memory in " << chrono.elapsedTimeInMs() << " ms and has size " << memOs.getNrOfBytes() << " bytes" << std::endl; } } return 0; }
TEST(Test1, pngReadsFromMemory) { std::cout << "########## Image memory read" << std::endl; Chrono chrono; IOUtils ioUtuls; ioUtuls.readFile(IMAGE1); MemoryPngInputStream memoryInputstream( (const png_bytep) ioUtuls.getBuffer(), (const png_size_t) ioUtuls.getLength()); std::cout << "Image read info memory in " << chrono.elapsedTimeInMs() << " ms" << std::endl; chrono.reset(); PngReader pngReaderFromMemory; pngReaderFromMemory.readFromInputstream(memoryInputstream); std::cout << "Image read memory in " << chrono.elapsedTimeInMs() << " ms" << std::endl; // Now compare that the data read first in memory produces the same result PngReader pngReaderFromFile; FilePngInputStream filePngInputStream(IMAGE1); pngReaderFromFile.readFromInputstream(filePngInputStream); AssertUtil::equals(pngReaderFromFile, pngReaderFromMemory); }