/// <summary> /// Writes a color image into a DjVu IW44 file. This function creates a /// composite Form element containing one or more IW44 encoded chunks. /// Data for each chunk is generated with a call to EncodeChunk method /// while encoding is controlled by the corresponding parameters in an array /// parameter settings. /// </summary> /// <param name="writer"></param> /// <param name="settings"></param> /// <returns></returns> public DjvuFormElement EncodeImage(IDjvuWriter writer, int nchunks, InterWaveEncoderSettings[] settings, ChunkType formType = ChunkType.PM44Form, ChunkType nodeType = ChunkType.PM44) { if (_YEncoder != null) { throw new DjvuInvalidOperationException($"Encoder already exists or left open from previous operation."); } int flag = 1; PM44Form form = (PM44Form)DjvuParser.CreateEncodedDjvuNode(writer, null, formType, 0); for (int i = 0; flag != 0 && i < nchunks; i++) { byte[] data = null; using (MemoryStream stream = new MemoryStream()) { flag = EncodeChunk(stream, settings[i]); data = new byte[stream.Position]; Buffer.BlockCopy(stream.GetBuffer(), 0, data, 0, data.Length); } PM44Chunk chunk = (PM44Chunk)DjvuParser.CreateEncodedDjvuNode(writer, form, nodeType, data.Length); chunk.ChunkData = data; form.AddChild(chunk); } CloseEncoder(); return(form); }
public void LoadTest078() { string file = Path.Combine(Util.ArtifactsPath, "test078C.djvu"); using (DjvuDocument document = new DjvuDocument()) { int hash = file.GetHashCode(); document.Load(file, hash); Assert.Equal(hash, document.Identifier); IDjvuPage page = document.ActivePage; PM44Chunk pmChunk = page.PageForm.Children[0] as PM44Chunk; Assert.IsType <PM44Chunk>(pmChunk); var img = pmChunk.Image; Assert.NotNull(img); var pixMap = new Wavelet.InterWavePixelMapDecoder(); pixMap = pmChunk.ProgressiveDecodeBackground(pixMap) as Wavelet.InterWavePixelMapDecoder; Assert.NotNull(pixMap); pmChunk = page.PageForm.Children[1] as PM44Chunk; Assert.NotNull(pmChunk); var pixMap2 = new Wavelet.InterWavePixelMapDecoder(); Assert.Throws <DjvuFormatException>(() => pmChunk.ProgressiveDecodeBackground(pixMap2)); // This time call will not throw pmChunk.ProgressiveDecodeBackground(pixMap); } }
public void PM44ChunkTest() { Mock <IDjvuReader> readerMock = new Mock <IDjvuReader>(); readerMock.Setup(x => x.Position).Returns(1024); PM44Chunk unk = new PM44Chunk(readerMock.Object, null, null, null, 0); Assert.Equal <ChunkType>(ChunkType.PM44, unk.ChunkType); Assert.Equal(ChunkType.PM44.ToString(), unk.Name); Assert.Equal <long>(1024, unk.DataOffset); }
public void ImageTest() { string file = Path.Combine(Util.ArtifactsDataPath, "test001C_P01.fg44"); using (FileStream stream = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.Read)) using (DjvuReader reader = new DjvuReader(stream)) { PM44Chunk unk = new PM44Chunk(reader, null, null, null, reader.Length); Assert.Equal <ChunkType>(ChunkType.PM44, unk.ChunkType); Assert.Equal(ChunkType.PM44.ToString(), unk.Name); Assert.Equal <long>(0, unk.DataOffset); Assert.Equal <long>(reader.Length, unk.Length); IInterWavePixelMap map = unk.Image; Assert.NotNull(map); } }
public void ReadDataTest() { Mock <IDjvuReader> readerMock = new Mock <IDjvuReader>(); readerMock.SetupProperty <long>(x => x.Position); IDjvuReader reader = readerMock.Object; reader.Position = 1024; PM44Chunk unk = new PM44Chunk(readerMock.Object, null, null, null, 1024); Assert.Equal <ChunkType>(ChunkType.PM44, unk.ChunkType); Assert.Equal(ChunkType.PM44.ToString(), unk.Name); Assert.Equal <long>(1024, unk.DataOffset); unk.ReadData(reader); Assert.Equal <long>(2048, reader.Position); }
public static IDjvuNode CreateEncodedDjvuNode(IDjvuWriter writer, IDjvuElement parent, ChunkType chunkType, long length) { IDjvuNode result = null; switch (chunkType) { case ChunkType.Djvm: result = new DjvmChunk(writer, parent, length); break; case ChunkType.Djvu: result = new DjvuChunk(writer, parent, length); break; case ChunkType.Djvi: result = new DjviChunk(writer, parent, length); break; case ChunkType.Thum: result = new ThumChunk(writer, parent, length); break; case ChunkType.Dirm: result = new DirmChunk(writer, parent, length); break; case ChunkType.Navm: result = new NavmChunk(writer, parent, length); break; case ChunkType.Anta: result = new AntaChunk(writer, parent, length); break; case ChunkType.Antz: result = new AntzChunk(writer, parent, length); break; case ChunkType.Txta: result = new TxtaChunk(writer, parent, length); break; case ChunkType.Txtz: result = new TxtzChunk(writer, parent, length); break; case ChunkType.Djbz: result = new DjbzChunk(writer, parent, length); break; case ChunkType.Sjbz: result = new SjbzChunk(writer, parent, length); break; case ChunkType.FG44: result = new FG44Chunk(writer, parent, length); break; case ChunkType.BG44: result = new BG44Chunk(writer, parent, length); break; case ChunkType.TH44: result = new TH44Chunk(writer, parent, length); break; case ChunkType.BM44: result = new BM44Chunk(writer, parent, length); break; case ChunkType.BM44Form: result = new BM44Form(writer, parent, length); break; case ChunkType.PM44: result = new PM44Chunk(writer, parent, length); break; case ChunkType.PM44Form: result = new PM44Form(writer, parent, length); break; case ChunkType.Wmrm: result = new WmrmChunk(writer, parent, length); break; case ChunkType.FGbz: result = new FGbzChunk(writer, parent, length); break; case ChunkType.Info: result = new InfoChunk(writer, parent, length); break; case ChunkType.Incl: result = new InclChunk(writer, parent, length); break; case ChunkType.BGjp: result = new BGjpChunk(writer, parent, length); break; case ChunkType.FGjp: result = new FGjpChunk(writer, parent, length); break; case ChunkType.Smmr: result = new SmmrChunk(writer, parent, length); break; default: throw new DjvuInvalidOperationException($"Chunk type is not supported in encoding. ChunkType: {chunkType}"); } return(result); }
/// <summary> /// Builds the appropriate chunk for the ID /// </summary> /// <returns></returns> public static IDjvuNode CreateDecodedDjvuNode(IDjvuReader reader, IDjvuDocument rootDocument, IDjvuElement parent, ChunkType chunkType, string chunkID = "", long length = 0) { IDjvuNode result = null; switch (chunkType) { case ChunkType.Djvm: result = new DjvmChunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.Djvu: result = new DjvuChunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.Djvi: result = new DjviChunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.Thum: result = new ThumChunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.Dirm: result = new DirmChunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.Navm: result = new NavmChunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.Anta: result = new AntaChunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.Antz: result = new AntzChunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.Txta: result = new TxtaChunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.Txtz: result = new TxtzChunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.Djbz: result = new DjbzChunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.Sjbz: result = new SjbzChunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.FG44: result = new FG44Chunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.BG44: result = new BG44Chunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.TH44: result = new TH44Chunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.BM44: result = new BM44Chunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.BM44Form: result = new BM44Form(reader, parent, rootDocument, chunkID, length); break; case ChunkType.PM44: result = new PM44Chunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.PM44Form: result = new PM44Form(reader, parent, rootDocument, chunkID, length); break; case ChunkType.Wmrm: result = new WmrmChunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.FGbz: result = new FGbzChunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.Info: result = new InfoChunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.Incl: result = new InclChunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.BGjp: result = new BGjpChunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.FGjp: result = new FGjpChunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.Smmr: result = new SmmrChunk(reader, parent, rootDocument, chunkID, length); break; case ChunkType.Cida: result = new CidaChunk(reader, parent, rootDocument, chunkID, length); break; default: result = new UnknownChunk(reader, parent, rootDocument, chunkID, length); break; } return(result); }
public void EncodeImage_Theory(string fileName) { string file = Path.Combine(Util.ArtifactsPath, fileName); string outFile = Path.Combine(Util.ArtifactsDataPath, fileName + ".djvu"); using (System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(file)) { bmp.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipX); int width = bmp.Width; int height = bmp.Height; var pixMap = PixelMapFromBitmap(bmp); var map = new InterWavePixelMapEncoder(); map.InitializeEncoder(pixMap, null, YCrCbMode.Full); int nchunks = 4; int[] slices = new int[] { 74, 90, 98, 103 }; //float[] decibel = new float[] { 5.0f, 10.0f, 15.0f, 20.0f }; InterWaveEncoderSettings[] settings = new InterWaveEncoderSettings[nchunks]; if (fileName != "") { for (int i = 0; i < nchunks; i++) { settings[i] = new InterWaveEncoderSettings { Slices = slices[i] }; } } //else //{ // for (int i = 0; i < nchunks; i++) // { // settings[i] = new InterWaveEncoderSettings // { // Decibels = decibel[i] // }; // } //} DjvuFormElement form = null; using (MemoryStream stream = new MemoryStream()) using (IDjvuWriter writer = new DjvuWriter(stream)) form = map.EncodeImage(writer, nchunks, settings); using (IDjvuWriter writer = new DjvuWriter(outFile)) form.WriteData(writer); using (DjvuDocument doc = new DjvuDocument(outFile)) { IDjvuPage page = doc.Pages[0]; PM44Form pageForm = (PM44Form)page.PageForm; Assert.Equal(nchunks, pageForm.Children.Count); Assert.NotNull(form); Assert.Equal(nchunks, form.Children.Count); Assert.IsType <PM44Form>(form); for (int i = 0; i < form.Children.Count; i++) { var c = form.Children[i]; Assert.NotNull(c); Assert.IsType <PM44Chunk>(c); PM44Chunk chunk = (PM44Chunk)c; Assert.NotNull(chunk.ChunkData); if (chunk.ChunkData.Length >= 2) { Assert.Equal(i, chunk.ChunkData[0]); Assert.Equal(slices[i] - (i == 0 ? 0 : slices[i - 1]), chunk.ChunkData[1]); if (i == 0) { Assert.Equal(1, chunk.ChunkData[2]); Assert.Equal(2, chunk.ChunkData[3]); int widthTest = chunk.ChunkData[4] << 8; widthTest |= chunk.ChunkData[5]; Assert.Equal(bmp.Width, widthTest); int heightTest = chunk.ChunkData[6] << 8; heightTest |= chunk.ChunkData[7]; Assert.Equal(bmp.Height, heightTest); } } } } } }
public void EncodeImageTest003() { string file = Path.Combine(Util.ArtifactsPath, "block001C.png"); string outFile = Path.Combine(Util.ArtifactsDataPath, "block001C.png.djvu"); using (System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(file)) { bmp.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipX); int width = bmp.Width; int height = bmp.Height; var pixMap = PixelMapFromBitmap(bmp); var map = new InterWavePixelMapEncoder(); map._CrCbDelay = 0; map.InitializeEncoder(pixMap, null, YCrCbMode.Full); int nchunks = 4; int[] slices = new int[] { 111, 152, 184, 200 }; InterWaveEncoderSettings[] settings = new InterWaveEncoderSettings[nchunks]; for (int i = 0; i < nchunks; i++) { settings[i] = new InterWaveEncoderSettings { Slices = slices[i] }; } map._dBFrac = 10.0f; DjvuFormElement form = null; using (MemoryStream stream = new MemoryStream()) using (IDjvuWriter writer = new DjvuWriter(stream)) form = map.EncodeImage(writer, nchunks, settings); using (IDjvuWriter writer = new DjvuWriter(outFile)) form.WriteData(writer); Assert.NotNull(form); Assert.Equal(nchunks, form.Children.Count); Assert.IsType <PM44Form>(form); for (int i = 0; i < form.Children.Count; i++) { var c = form.Children[i]; Assert.NotNull(c); Assert.IsType <PM44Chunk>(c); PM44Chunk chunk = (PM44Chunk)c; Assert.NotNull(chunk.ChunkData); if (chunk.ChunkData.Length >= 2) { Assert.Equal(i, chunk.ChunkData[0]); if (i == 0) { Assert.Equal(1, chunk.ChunkData[2]); Assert.Equal(2, chunk.ChunkData[3]); int widthTest = chunk.ChunkData[4] << 8; widthTest |= chunk.ChunkData[5]; Assert.Equal(bmp.Width, widthTest); int heightTest = chunk.ChunkData[6] << 8; heightTest |= chunk.ChunkData[7]; Assert.Equal(bmp.Height, heightTest); } } } //using (DjvuDocument doc = new DjvuDocument(outFile)) //{ // IDjvuPage page = doc.Pages[0]; // IDjvuElement pageForm = page.PageForm; // Assert.Equal(nchunks, pageForm.Children.Count); //} } }