static void testmirror(string orig, string origni, string truecolor) { string mirror = TestsHelper.addSuffixToName(orig, "_mirror"); string recov = TestsHelper.addSuffixToName(orig, "_recov"); long crc0 = 0; bool interlaced; bool palete; { PngReader pngr = FileHelper.CreatePngReader(orig); palete = pngr.ImgInfo.Indexed; PngHelperInternal.InitCrcForTests(pngr); pngr.SetUnpackedMode(true); interlaced = pngr.IsInterlaced(); PngWriter pngw = FileHelper.CreatePngWriter(mirror, pngr.ImgInfo, true); pngw.SetFilterType(FilterType.FILTER_CYCLIC); // just to test all filters pngw.CopyChunksFirst(pngr, ChunkCopyBehaviour.COPY_ALL); pngw.SetUseUnPackedMode(true); for (int row = 0; row < pngr.ImgInfo.Rows; row++) { ImageLine line = pngr.ReadRowInt(row); mirrorLine(line); pngw.WriteRow(line, row); } pngr.End(); crc0 = PngHelperInternal.GetCrctestVal(pngr); pngw.CopyChunksFirst(pngr, ChunkCopyBehaviour.COPY_ALL); pngw.End(); } // mirror again, now with BYTE (if depth<16) and loading all rows { PngReader pngr2 = FileHelper.CreatePngReader(mirror); pngr2.SetUnpackedMode(true); PngWriter pngw = FileHelper.CreatePngWriter(recov, pngr2.ImgInfo, true); pngw.SetFilterType(FilterType.FILTER_AGGRESSIVE); pngw.CopyChunksFirst(pngr2, ChunkCopyBehaviour.COPY_ALL); pngw.SetUseUnPackedMode(true); ImageLines lines = pngr2.ImgInfo.BitDepth < 16 ? pngr2.ReadRowsByte() : pngr2 .ReadRowsInt(); for (int row = 0; row < pngr2.ImgInfo.Rows; row++) { ImageLine line = lines.GetImageLineAtMatrixRow(row); mirrorLine(line); pngw.WriteRow(line, row); } pngr2.End(); pngw.End(); } // now check if (orig[11] != 'i') { TestsHelper.testCrcEquals(recov, crc0); } //if (interlaced) // additionalTestInterlaced(orig, origni); //if (palete && System.IO.File.Exists(truecolor)) // additionalTestPalette(orig, truecolor); }
private void _convert(string inputPdfPath) { _outputToInfo(inputPdfPath); // make a sub path in the same folder as this // put file(s) in there // single file has NAME.png // multiples are NAME_000.png // overwrite just uses folder always // otherwise, append output folder if it exists and is NOT empty try { outputFolder = _createOutputFolder(inputPdfPath, _overwrite); if (outputFolder == null) { _outputToInfo("Error"); return; } string historyFile = Path.Combine(outputFolder, "history.txt"); _outputToInfo("Output to: " + outputFolder); _outputToInfo(" "); using (GhostscriptRasterizer rasterizer = new GhostscriptRasterizer()) { rasterizer.Open(inputPdfPath, _lastInstalledVersion, false); if (_multiFiles) { string outputPath = Path.Combine(outputFolder, Path.GetFileNameWithoutExtension(inputPdfPath)); int nFiles = 0; for (int pageNumber = 1; pageNumber <= rasterizer.PageCount; pageNumber++) { if (cancel) { break; } if (_isPageNumberRequired(pageNumber)) { string pageFilePath = outputPath + "_" + pageNumber.ToString("000") + _imageExt; Image img = rasterizer.GetPage(_dpi, _dpi, pageNumber); img.Save(pageFilePath, _imageFmt); _outputToInfo(img); _outputToInfo(" " + Path.GetFileName(pageFilePath)); _outputToInfo(" Dimensions:" + img.Width + " x " + img.Height); _outputToInfo(); _history(historyFile, inputPdfPath, pageFilePath); nFiles++; } } _outputToInfo(" complete, " + nFiles + " files in:"); _outputToInfo(" " + outputFolder); _outputToInfo(); } else { // work in PNG here string outputPath = Path.GetTempPath(); string prefix = Guid.NewGuid().ToString().Substring(0, 7); List <string> pathList = new List <string>(); int w = 0, h = 0; for (int pageNumber = 1; pageNumber <= rasterizer.PageCount; pageNumber++) { if (cancel) { break; } if (_isPageNumberRequired(pageNumber)) { string pageFilePath = Path.Combine(outputPath, prefix + "_" + pageNumber.ToString() + ".png"); Image img = rasterizer.GetPage(_dpi, _dpi, pageNumber); img.Save(pageFilePath, ImageFormat.Png); _outputToInfo(img); pathList.Add(pageFilePath); _outputToInfo(" building page: " + pageNumber + " of " + rasterizer.PageCount); _outputToInfo(); h += img.Height; w = Math.Max(w, img.Width); } } // combine!! if (cancel == false && pathList.Count > 0) { string bigImagePath = Path.Combine(outputPath, prefix + "_BIG" + ".png"); PngReader pngr = FileHelper.CreatePngReader(pathList[0]); // or you can use the constructor ImageInfo ii = new ImageInfo(w, h, pngr.ImgInfo.BitDepth, pngr.ImgInfo.Alpha, false, false); PngWriter pngw = FileHelper.CreatePngWriter(bigImagePath, ii, true); int chunkBehav = ChunkCopyBehaviour.COPY_ALL_SAFE; // tell to copy all 'safe' chunks pngw.CopyChunksFirst(pngr, chunkBehav); // copy some metadata from reader pngr.End(); int destRow = 0; int ic = 1; foreach (string path in pathList) { pngr = FileHelper.CreatePngReader(path); ImageLines iLines = pngr.ReadRowsInt(0, pngr.ImgInfo.Rows, 1); int nrr = iLines.Nrows; for (int i = 0; i < nrr; i++) { pngw.WriteRow(iLines.GetImageLineAtMatrixRow(i), destRow++); } _outputToInfo(" combining page:" + ic + " of " + pathList.Count); ic++; pngr.End(); File.Delete(path); // remove them as we go } pngw.CopyChunksLast(pngr, chunkBehav); // metadata after the image pixels? can happen pngw.End(); // dont forget this _autoCrop(bigImagePath); // convert to required type if not PNG string outputSingleFile = Path.Combine(outputFolder, Path.GetFileNameWithoutExtension(inputPdfPath) + _imageExt); Bitmap bm; if (_imageExt != ".png") { bm = new Bitmap(bigImagePath); bm.Save(outputSingleFile, _imageFmt); } else { bm = new Bitmap(bigImagePath); _moveFile(bigImagePath, outputSingleFile); } _outputToInfo(bm); _outputToInfo(" Dimensions:" + bm.Width + " x " + bm.Height); _outputToInfo(" Complete: "); _outputToInfo(" " + outputSingleFile); _history(historyFile, inputPdfPath, outputSingleFile); } else { _outputToInfo(" NO PAGES set! Try again."); } } } } catch (Exception ex) { _outputToInfo("Error"); _outputToInfo(ex.ToString()); throw; } }