コード例 #1
0
ファイル: File.cs プロジェクト: juschubut/kenos
        /// <summary>
        ///    Creates a list of Chunks containing the PNG keywords
        /// </summary>
        /// <returns>
        ///    A <see cref="ByteVector"/> with the list of chunks, or
        ///    or <see langword="null" /> if no PNG Keywords are contained.
        /// </returns>
        private ByteVector RenderKeywordChunks()
        {
            // Check, if PngTag is contained
            PngTag png_tag = GetTag(TagTypes.Png, true) as PngTag;

            if (png_tag == null)
            {
                return(null);
            }

            ByteVector chunks = new ByteVector();

            foreach (KeyValuePair <string, string> keyword in png_tag)
            {
                ByteVector data = new ByteVector();
                data.Add(keyword.Key);
                data.Add("\0");
                data.Add(keyword.Value);

                chunks.Add(ByteVector.FromUInt((uint)data.Count));
                chunks.Add(tEXt_CHUNK_TYPE);
                chunks.Add(data);
                chunks.Add(ComputeCRC(tEXt_CHUNK_TYPE, data));
            }

            return(chunks);
        }
コード例 #2
0
ファイル: File.cs プロジェクト: juschubut/kenos
        /// <summary>
        ///    Reads an iTXt Chunk from file. The current position must be set
        ///    to the start of the Chunk Data. Such a Chunk may contain XMP data
        ///    or translated keywords.
        /// </summary>
        /// <param name="data_length">
        ///    A <see cref="System.Int32"/> with the length of the Chunk Data.
        /// </param>
        //private void ReadiTXtChunk (int data_length)
        //{
        //    long position = Tell;

        //    // iTXt Chunk
        //    //
        //    // N Bytes     Keyword
        //    // 1 Byte      Null Separator
        //    // 1 Byte      Compression Flag (0 for uncompressed data)
        //    // 1 Byte      Compression Method
        //    // N Bytes     Language Tag
        //    // 1 Byte      Null Separator
        //    // N Bytes     Translated Keyword
        //    // 1 Byte      Null Terminator
        //    // N Bytes     Txt
        //    //
        //    // Followed by 4 Bytes CRC data

        //    ByteVector data = ReadChunkData (data_length);

        //    CheckCRC (iTXt_CHUNK_TYPE, data, ReadCRC ());

        //    // handle XMP, which has a fixed header
        //    if (data.StartsWith (XMP_CHUNK_HEADER)) {
        //        ImageTag.AddTag (new XmpTag (data.Mid (XMP_CHUNK_HEADER.Length).ToString (StringType.UTF8), this));

        //        AddMetadataBlock (position - 8, data_length + 8 + 4);

        //        return;
        //    }

        //    int terminator_index;
        //    string keyword = ReadKeyword (data, 0, out terminator_index);

        //    if (terminator_index + 2 >= data_length)
        //        throw new CorruptFileException ("Compression Flag and Compression Method byte expected");

        //    byte compression_flag = data[terminator_index + 1];
        //    byte compression_method = data[terminator_index + 2];

        //    //string language = ReadTerminatedString (data, terminator_index + 3, out terminator_index);
        //    //string translated_keyword = ReadTerminatedString (data, terminator_index + 1, out terminator_index);

        //    ByteVector txt_data = data.Mid (terminator_index + 1);

        //    if (compression_flag != 0x00) {
        //        txt_data = Decompress (compression_method, txt_data);

        //        // ignore unknown compression methods
        //        if (txt_data == null)
        //            return;
        //    }

        //    string value = txt_data.ToString ();
        //    PngTag png_tag = GetTag (TagTypes.Png, true) as PngTag;

        //    if (png_tag.GetKeyword (keyword) == null)
        //        png_tag.SetKeyword (keyword, value);

        //    AddMetadataBlock (position - 8, data_length + 8 + 4);
        //}


        /// <summary>
        ///    Reads an tEXt Chunk from file. The current position must be set
        ///    to the start of the Chunk Data. Such a Chunk contains plain
        ///    keywords.
        /// </summary>
        /// <param name="data_length">
        ///    A <see cref="System.Int32"/> with the length of the Chunk Data.
        /// </param>
        private void ReadtEXtChunk(int data_length)
        {
            long position = Tell;

            // tEXt Chunk
            //
            // N Bytes     Keyword
            // 1 Byte      Null Separator
            // N Bytes     Txt
            //
            // Followed by 4 Bytes CRC data

            ByteVector data = ReadChunkData(data_length);

            CheckCRC(tEXt_CHUNK_TYPE, data, ReadCRC());

            int    keyword_terminator;
            string keyword = ReadKeyword(data, 0, out keyword_terminator);

            string value = data.Mid(keyword_terminator + 1).ToString();

            PngTag png_tag = GetTag(TagTypes.Png, true) as PngTag;

            if (png_tag.GetKeyword(keyword) == null)
            {
                png_tag.SetKeyword(keyword, value);
            }

            AddMetadataBlock(position - 8, data_length + 8 + 4);
        }