static int[][] getDct(string filename) { jpeg_decompress_struct cinfo = new jpeg_decompress_struct(); FileStream objFileStreamHeaderImage = new FileStream(filename, FileMode.Open, FileAccess.Read); cinfo.jpeg_stdio_src(objFileStreamHeaderImage); cinfo.jpeg_read_header(true); var coeffs = cinfo.jpeg_read_coefficients(); const int size = 64; int height = cinfo.Image_height / size; int width = cinfo.Image_width / size; int[][] result = new int[height * width][]; var dct = coeffs[0].Access(0, height); for (int i = 0; i < height * width; i++) { result[i] = new int[size]; } for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { for (int k = 0; k < 64; k++) { result[i * width + j][k] = dct[i][j][k]; } } } return result; }
public void TestMarkerList() { jpeg_decompress_struct cinfo = new jpeg_decompress_struct(); using (FileStream input = new FileStream(Path.Combine(Tester.Testcase, "PARROTS.JPG"), FileMode.Open)) { /* Specify data source for decompression */ cinfo.jpeg_stdio_src(input); const int markerDataLengthLimit = 1000; cinfo.jpeg_save_markers((int)JPEG_MARKER.COM, markerDataLengthLimit); cinfo.jpeg_save_markers((int)JPEG_MARKER.APP0, markerDataLengthLimit); /* Read file header, set default decompression parameters */ cinfo.jpeg_read_header(true); Assert.AreEqual(cinfo.Marker_list.Count, 3); int[] expectedMarkerType = { (int)JPEG_MARKER.APP0, (int)JPEG_MARKER.APP0, (int)JPEG_MARKER.COM }; int[] expectedMarkerOriginalLength = { 14, 3072, 10 }; for (int i = 0; i < cinfo.Marker_list.Count; ++i) { jpeg_marker_struct marker = cinfo.Marker_list[i]; Assert.IsNotNull(marker); Assert.AreEqual(marker.Marker, expectedMarkerType[i]); Assert.AreEqual(marker.OriginalLength, expectedMarkerOriginalLength[i]); Assert.LessOrEqual(marker.Data.Length, markerDataLengthLimit); } } }
private static void decompress(Stream input, DecompressOptions options, Stream output) { Debug.Assert(input != null); Debug.Assert(options != null); Debug.Assert(output != null); /* Initialize the JPEG decompression object with default error handling. */ jpeg_decompress_struct cinfo = new jpeg_decompress_struct(new cd_jpeg_error_mgr()); /* Insert custom marker processor for COM and APP12. * APP12 is used by some digital camera makers for textual info, * so we provide the ability to display it as text. * If you like, additional APPn marker types can be selected for display, * but don't try to override APP0 or APP14 this way (see libjpeg.doc). */ cinfo.jpeg_set_marker_processor((int)JPEG_MARKER.COM, new jpeg_decompress_struct.jpeg_marker_parser_method(printTextMarker)); cinfo.jpeg_set_marker_processor((int)JPEG_MARKER.APP0 + 12, printTextMarker); /* Specify data source for decompression */ cinfo.jpeg_stdio_src(input); /* Read file header, set default decompression parameters */ cinfo.jpeg_read_header(true); applyOptions(cinfo, options); /* Initialize the output module now to let it override any crucial * option settings (for instance, GIF wants to force color quantization). */ djpeg_dest_struct dest_mgr = null; switch (options.OutputFormat) { case IMAGE_FORMATS.FMT_BMP: dest_mgr = new bmp_dest_struct(cinfo, false); break; case IMAGE_FORMATS.FMT_OS2: dest_mgr = new bmp_dest_struct(cinfo, true); break; default: cinfo.ERREXIT((int)ADDON_MESSAGE_CODE.JERR_UNSUPPORTED_FORMAT); break; } dest_mgr.output_file = output; /* Start decompressor */ cinfo.jpeg_start_decompress(); /* Write output file header */ dest_mgr.start_output(); /* Process data */ while (cinfo.Output_scanline < cinfo.Output_height) { int num_scanlines = cinfo.jpeg_read_scanlines(dest_mgr.buffer, dest_mgr.buffer_height); dest_mgr.put_pixel_rows(num_scanlines); } /* Finish decompression and release memory. * I must do it in this order because output module has allocated memory * of lifespan JPOOL_IMAGE; it needs to finish before releasing memory. */ dest_mgr.finish_output(); cinfo.jpeg_finish_decompress(); /* All done. */ if (cinfo.Err.Num_warnings != 0) Console.WriteLine("Corrupt-data warning count is not zero"); }
static string outfilename; /* for -outfile switch */ public static void Main(string[] args) { progname = Path.GetFileName(Environment.GetCommandLineArgs()[0]); /* Initialize the JPEG decompression object with default error handling. */ cd_jpeg_error_mgr err = new cd_jpeg_error_mgr(); jpeg_decompress_struct cinfo = new jpeg_decompress_struct(err); /* Insert custom marker processor for COM and APP12. * APP12 is used by some digital camera makers for textual info, * so we provide the ability to display it as text. * If you like, additional APPn marker types can be selected for display, * but don't try to override APP0 or APP14 this way (see libjpeg.doc). */ cinfo.jpeg_set_marker_processor((int)JPEG_MARKER.COM, new jpeg_decompress_struct.jpeg_marker_parser_method(print_text_marker)); cinfo.jpeg_set_marker_processor((int)JPEG_MARKER.APP0 + 12, print_text_marker); /* Scan command line to find file names. */ /* It is convenient to use just one switch-parsing routine, but the switch * values read here are ignored; we will rescan the switches after opening * the input file. * (Exception: tracing level set here controls verbosity for COM markers * found during jpeg_read_header...) */ int file_index; if (!parse_switches(cinfo, args, false, out file_index)) { usage(); return; } /* Must have either -outfile switch or explicit output file name */ if (outfilename == null) { // file_index should point to input file if (file_index != args.Length - 2) { Console.WriteLine(string.Format("{0}: must name one input and one output file.", progname)); usage(); return; } // output file comes right after input one outfilename = args[file_index + 1]; } else { // file_index should point to input file if (file_index != args.Length - 1) { Console.WriteLine(string.Format("{0}: must name one input and one output file.", progname)); usage(); return; } } /* Open the input file. */ FileStream input_file = null; if (file_index < args.Length) { try { input_file = new FileStream(args[file_index], FileMode.Open); } catch (Exception e) { Console.WriteLine(string.Format("{0}: can't open {1}", progname, args[file_index])); Console.WriteLine(e.Message); return; } } else { Console.WriteLine(string.Format("{0}: sorry, can't read file from console")); return; } /* Open the output file. */ FileStream output_file = null; if (outfilename != null) { try { output_file = new FileStream(outfilename, FileMode.Create); } catch (Exception e) { Console.WriteLine(string.Format("{0}: can't open {1}", progname, args[file_index])); Console.WriteLine(e.Message); return; } } else { Console.WriteLine(string.Format("{0}: sorry, can't write file to console")); return; } /* Specify data source for decompression */ cinfo.jpeg_stdio_src(input_file); /* Read file header, set default decompression parameters */ cinfo.jpeg_read_header(true); /* Adjust default decompression parameters by re-parsing the options */ parse_switches(cinfo, args, true, out file_index); /* Initialize the output module now to let it override any crucial * option settings (for instance, GIF wants to force color quantization). */ djpeg_dest_struct dest_mgr = null; switch (requested_fmt) { case IMAGE_FORMATS.FMT_BMP: dest_mgr = new bmp_dest_struct(cinfo, false); break; case IMAGE_FORMATS.FMT_OS2: dest_mgr = new bmp_dest_struct(cinfo, true); break; default: cinfo.ERREXIT((int)ADDON_MESSAGE_CODE.JERR_UNSUPPORTED_FORMAT); break; } dest_mgr.output_file = output_file; /* Start decompressor */ cinfo.jpeg_start_decompress(); /* Write output file header */ dest_mgr.start_output(); /* Process data */ while (cinfo.Output_scanline < cinfo.Output_height) { int num_scanlines = cinfo.jpeg_read_scanlines(dest_mgr.buffer, dest_mgr.buffer_height); dest_mgr.put_pixel_rows(num_scanlines); } /* Finish decompression and release memory. * I must do it in this order because output module has allocated memory * of lifespan JPOOL_IMAGE; it needs to finish before releasing memory. */ dest_mgr.finish_output(); cinfo.jpeg_finish_decompress(); /* Close files, if we opened them */ input_file.Close(); input_file.Dispose(); output_file.Close(); output_file.Dispose(); /* All done. */ if (cinfo.Err.Num_warnings != 0) Console.WriteLine("Corrupt-data warning count is not zero"); }
public static jvirt_array<BitMiracle.LibJpeg.Classic.JBLOCK>[] ReadCoefFromImage(string fullPath) { var img = new Bitmap(fullPath); var width = img.Width; var height = img.Height; img.Dispose(); BitMiracle.LibJpeg.Classic.jpeg_decompress_struct oJpegDecompress = new BitMiracle.LibJpeg.Classic.jpeg_decompress_struct(); System.IO.FileStream oFileStreamImage = new System.IO.FileStream(fullPath, System.IO.FileMode.Open, System.IO.FileAccess.Read); oJpegDecompress.jpeg_stdio_src(oFileStreamImage); oJpegDecompress.jpeg_read_header(true); BitMiracle.LibJpeg.Classic.jvirt_array<BitMiracle.LibJpeg.Classic.JBLOCK>[] JBlock = oJpegDecompress.jpeg_read_coefficients(); oJpegDecompress.jpeg_finish_decompress(); oFileStreamImage.Close(); return JBlock; }
public static string IncImageDCT(string fullPath) { string suffix = "testDCT"; var img = new Bitmap(fullPath); var width = img.Width; var height = img.Height; int hd = height / 8; int wd = width / 8; img.Dispose(); BitMiracle.LibJpeg.Classic.jpeg_decompress_struct oJpegDecompress = new BitMiracle.LibJpeg.Classic.jpeg_decompress_struct(); System.IO.FileStream oFileStreamImage = new System.IO.FileStream(fullPath, System.IO.FileMode.Open, System.IO.FileAccess.Read); oJpegDecompress.jpeg_stdio_src(oFileStreamImage); oJpegDecompress.jpeg_read_header(true); BitMiracle.LibJpeg.Classic.jvirt_array<BitMiracle.LibJpeg.Classic.JBLOCK>[] JBlock = oJpegDecompress.jpeg_read_coefficients(); var block = JBlock[0].Access(0, hd); // accessing the element for (int i = 0; i < hd; i++) { for (int j = 0; j < wd; j++) { short t = block[i][j].data[0]; if ((t >= 0 && t % 2 == 1) || (t < 0 && t % 2 == 0)) { t--; } else if ((t >= 0 && t % 2 == 0) || (t < 0 && t % 2 == 1)) { t++; } block[i][j].data[0] = t; } } oJpegDecompress.jpeg_finish_decompress(); oFileStreamImage.Close(); //// string filenameNew = MyHelper.AppendFileName(fullPath, suffix); System.IO.FileStream objFileStreamMegaMap = System.IO.File.Create(filenameNew); BitMiracle.LibJpeg.Classic.jpeg_compress_struct oJpegCompress = new BitMiracle.LibJpeg.Classic.jpeg_compress_struct(); oJpegCompress.jpeg_stdio_dest(objFileStreamMegaMap); oJpegDecompress.jpeg_copy_critical_parameters(oJpegCompress); oJpegCompress.Image_height = height; oJpegCompress.Image_width = width; oJpegCompress.jpeg_write_coefficients(JBlock); oJpegCompress.jpeg_finish_compress(); objFileStreamMegaMap.Close(); oJpegDecompress.jpeg_abort_decompress(); return filenameNew; }