/// <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 PM44FormTest() { Mock <IDjvuReader> readerMock = new Mock <IDjvuReader>(); readerMock.Setup(x => x.Position).Returns(1024); PM44Form unk = new PM44Form(readerMock.Object, null, null, null, 0); Assert.Equal <ChunkType>(ChunkType.PM44Form, unk.ChunkType); Assert.Equal(ChunkType.PM44Form.ToString(), unk.Name); Assert.Equal <long>(1024, unk.DataOffset); }
public void WriteDataTest() { byte[] buffer = new byte[2048]; Mock <IDjvuReader> readerMock = new Mock <IDjvuReader>(); readerMock.Setup(x => x.Position).Returns(1024); Mock <DjvuNode> nodeMock1 = new Mock <DjvuNode> { CallBase = true }; nodeMock1.Object.ChunkData = buffer; nodeMock1.Setup(x => x.Name).Returns("PM44"); nodeMock1.Object.Length = buffer.Length; Mock <DjvuNode> nodeMock2 = new Mock <DjvuNode> { CallBase = true }; nodeMock2.Object.ChunkData = buffer; nodeMock2.Setup(x => x.Name).Returns("PM44"); nodeMock2.Object.Length = buffer.Length; Mock <IDjvuWriter> writerMock = new Mock <IDjvuWriter>(); writerMock.Setup <long>(x => x.WriteUTF8String(It.IsAny <string>())).Returns(4); writerMock.Setup(x => x.WriteUInt32BigEndian(It.IsAny <uint>())); writerMock.Setup(x => x.Write(buffer, 0, buffer.Length)); PM44Form form = new PM44Form(readerMock.Object, null, null, "PM44Form", 2048); form.ChunkData = buffer; int result = form.AddChild(nodeMock1.Object); Assert.Equal <int>(1, result); Assert.Equal <int>(1, form.Children.Count); result = form.InsertChild(0, nodeMock2.Object); Assert.Equal <int>(2, result); Assert.Equal <int>(2, form.Children.Count); form.WriteData(writerMock.Object); writerMock.Verify(x => x.WriteUTF8String("FORM"), Times.Once()); writerMock.Verify(x => x.WriteUTF8String("PM44"), Times.Exactly(3)); writerMock.Verify(x => x.WriteUInt32BigEndian((uint)buffer.Length), Times.Exactly(2)); writerMock.Verify(x => x.WriteUInt32BigEndian(((uint)buffer.Length + 8) * 2 + 4), Times.Exactly(1)); writerMock.Verify(x => x.Write(buffer, 0, buffer.Length), Times.Exactly(2)); }
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; IPixelMap pixMap = PixelMapFromBitmap(bmp); var map = new InterWavePixelMapEncoder(); map.InitializeEncoder(pixMap, null, YCrCbMode.Full); const 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; if (nchunks != pageForm.Children.Count) { Assert.True(false); } if (nchunks != form.Children.Count) { Assert.True(false); } Assert.IsType <PM44Form>(form); for (int i = 0; i < nchunks; i++) { IDjvuNode c = form.Children[i]; if (c == null) { Assert.True(false); } byte[] chunkDataBuffer = null; if (!(c is PM44Chunk chunk)) { Assert.True(false); }
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); } } } } } }