Beispiel #1
0
        public void Parse(Stream stream)
        {
            uint b   = 0;
            int  rem = 0;
            byte c   = (byte)StreamUtil.GetBit(stream, ref rem, ref b, 1);

            if (c != 0)
            {
                int scale_bits = (int)StreamUtil.GetBit(stream, ref rem, ref b, 5);
                scale_x = (short)StreamUtil.GetBit(stream, ref rem, ref b, scale_bits);
                scale_y = (short)StreamUtil.GetBit(stream, ref rem, ref b, scale_bits);
            }
            c = (byte)StreamUtil.GetBit(stream, ref rem, ref b, 1);
            if (c != 0)
            {
                int rotate_bits = (int)StreamUtil.GetBit(stream, ref rem, ref b, 5);
                rotate_skew0 = (short)StreamUtil.GetBit(stream, ref rem, ref b, rotate_bits);
                rotate_skew1 = (short)StreamUtil.GetBit(stream, ref rem, ref b, rotate_bits);
            }
            int translate_bits = (int)StreamUtil.GetBit(stream, ref rem, ref b, 5);

            translate_x = (short)StreamUtil.GetBit(stream, ref rem, ref b, translate_bits);
            translate_y = (short)StreamUtil.GetBit(stream, ref rem, ref b, translate_bits);
        }
Beispiel #2
0
        public void SaveJPG(string dir)
        {
            if (!dir.EndsWith("\\"))
            {
                dir += "\\";
            }
            Directory.CreateDirectory(dir);
            int count = 1;

            byte[] jpeg_tables = null;

            for (int i = 0; i < tag_list_.Count; ++i)
            {
                if ((int)tag_list_[i].tag == (int)ObjectType.DefineBitsJPEG || (int)tag_list_[i].tag == (int)ObjectType.DefineBitsJPEG2 ||
                    (int)tag_list_[i].tag == (int)ObjectType.DefineBitsJPEG3)
                {
                    FileStream fs = null;
                    try
                    {
                        fs = new FileStream(dir + count.ToString("0000") + ".jpg", FileMode.Create, FileAccess.Write);
                        if ((int)tag_list_[i].tag == (int)ObjectType.DefineBitsJPEG3)
                        {
                            // 最初の2バイトはタグなので無視
                            data_reader_.BaseStream.Seek(tag_list_[i].position + 2, SeekOrigin.Begin);
                            int image_data_size = data_reader_.ReadInt32();

                            StreamUtil.Copy(data_stream_, fs, image_data_size);
                        }
                        else
                        {
                            const int header_size = 20;
                            byte[]    pre_search  = new byte[6];
                            data_stream_.Seek(tag_list_[i].position, SeekOrigin.Begin);
                            data_stream_.Read(pre_search, 0, pre_search.Length);
                            int offset = 2;
                            if (pre_search[3] == 0xD9 && pre_search[5] == 0xD8)
                            {
                                offset += 4;
                            }
                            data_stream_.Seek(tag_list_[i].position + offset, SeekOrigin.Begin);
                            StreamUtil.Copy(data_stream_, fs, header_size);
                            if (tag_list_[i].tag == 6 && jpeg_tables != null)
                            {
                                fs.Write(jpeg_tables, 2, jpeg_tables.Length - 4); // 最初と最後2バイトずつは除く
                            }
                            StreamUtil.Copy(data_stream_, fs, (int)tag_list_[i].size - header_size - offset);
                        }
                        ++count;
                    }
                    finally
                    {
                        if (fs != null)
                        {
                            fs.Close();
                        }
                    }
                }
                else if ((int)tag_list_[i].tag == (int)ObjectType.JPEGTables)
                {
                    jpeg_tables = new byte[tag_list_[i].size];
                    data_stream_.Seek(tag_list_[i].position, SeekOrigin.Begin);
                    data_stream_.Read(jpeg_tables, 0, (int)tag_list_[i].size);
                }
            }
        }