Exemplo n.º 1
0
        public static TiffDataFormat FromTiffFormatCode(TiffDataFormatCode tiffFormatCode)
        {
            switch (tiffFormatCode)
            {
            case TiffDataFormatCode.Int8U:     return(Int8U);

            case TiffDataFormatCode.String:    return(String);

            case TiffDataFormatCode.Int16U:    return(Int16U);

            case TiffDataFormatCode.Int32U:    return(Int32U);

            case TiffDataFormatCode.RationalU: return(RationalU);

            case TiffDataFormatCode.Int8S:     return(Int8S);

            case TiffDataFormatCode.Undefined: return(Undefined);

            case TiffDataFormatCode.Int16S:    return(Int16S);

            case TiffDataFormatCode.Int32S:    return(Int32S);

            case TiffDataFormatCode.RationalS: return(RationalS);

            case TiffDataFormatCode.Single:    return(Single);

            case TiffDataFormatCode.Double:    return(Double);
            }

            return(null);
        }
Exemplo n.º 2
0
        public override bool TryCustomProcessFormat(int tagId, TiffDataFormatCode formatCode, uint componentCount, out long byteCount)
        {
            if ((ushort)formatCode == 13u)
            {
                byteCount = 4 * componentCount;
                return(true);
            }

            // an unknown (0) formatCode needs to be potentially handled later as a highly custom directory tag
            if (formatCode == 0)
            {
                byteCount = 0;
                return(true);
            }

            byteCount = default(int);
            return(false);
        }
Exemplo n.º 3
0
        public static TiffDataFormat?FromTiffFormatCode(TiffDataFormatCode tiffFormatCode)
        {
            return(tiffFormatCode switch
            {
                TiffDataFormatCode.Int8U => Int8U,
                TiffDataFormatCode.String => String,
                TiffDataFormatCode.Int16U => Int16U,
                TiffDataFormatCode.Int32U => Int32U,
                TiffDataFormatCode.RationalU => RationalU,
                TiffDataFormatCode.Int8S => Int8S,
                TiffDataFormatCode.Undefined => Undefined,
                TiffDataFormatCode.Int16S => Int16S,
                TiffDataFormatCode.Int32S => Int32S,
                TiffDataFormatCode.RationalS => RationalS,
                TiffDataFormatCode.Single => Single,
                TiffDataFormatCode.Double => Double,

                _ => null,
            });
        public static TiffDataFormat FromTiffFormatCode(TiffDataFormatCode tiffFormatCode)
        {
            switch (tiffFormatCode)
            {
                case TiffDataFormatCode.Int8U:     return Int8U;
                case TiffDataFormatCode.String:    return String;
                case TiffDataFormatCode.Int16U:    return Int16U;
                case TiffDataFormatCode.Int32U:    return Int32U;
                case TiffDataFormatCode.RationalU: return RationalU;
                case TiffDataFormatCode.Int8S:     return Int8S;
                case TiffDataFormatCode.Undefined: return Undefined;
                case TiffDataFormatCode.Int16S:    return Int16S;
                case TiffDataFormatCode.Int32S:    return Int32S;
                case TiffDataFormatCode.RationalS: return RationalS;
                case TiffDataFormatCode.Single:    return Single;
                case TiffDataFormatCode.Double:    return Double;
            }

            return null;
        }
Exemplo n.º 5
0
 public abstract bool TryCustomProcessFormat(int tagId, TiffDataFormatCode formatCode, uint componentCount, out long byteCount);
        public override bool TryCustomProcessFormat(int tagId, TiffDataFormatCode formatCode, uint componentCount, out long byteCount)
        {
            if ((ushort)formatCode == 13u)
            {
                byteCount = 4 * componentCount;
                return true;
            }

            byteCount = default(int);
            return false;
        }
Exemplo n.º 7
0
 private TiffDataFormat([NotNull] string name, TiffDataFormatCode tiffFormatCode, int componentSizeBytes)
 {
     Name               = name;
     TiffFormatCode     = tiffFormatCode;
     ComponentSizeBytes = componentSizeBytes;
 }
Exemplo n.º 8
0
        /// <exception cref="System.IO.IOException"/>
        private static void ProcessTag(ITiffHandler handler, int tagId, int tagValueOffset, int componentCount, TiffDataFormatCode formatCode, IndexedReader reader)
        {
            switch (formatCode)
            {
            case TiffDataFormatCode.Undefined:
            {
                // this includes exif user comments
                handler.SetByteArray(tagId, reader.GetBytes(tagValueOffset, componentCount));
                break;
            }

            case TiffDataFormatCode.String:
            {
                handler.SetString(tagId, reader.GetNullTerminatedStringValue(tagValueOffset, componentCount));
                break;
            }

            case TiffDataFormatCode.RationalS:
            {
                if (componentCount == 1)
                {
                    handler.SetRational(tagId, new Rational(reader.GetInt32(tagValueOffset), reader.GetInt32(tagValueOffset + 4)));
                }
                else if (componentCount > 1)
                {
                    var array = new Rational[componentCount];
                    for (var i = 0; i < componentCount; i++)
                    {
                        array[i] = new Rational(reader.GetInt32(tagValueOffset + 8 * i), reader.GetInt32(tagValueOffset + 4 + 8 * i));
                    }
                    handler.SetRationalArray(tagId, array);
                }
                break;
            }

            case TiffDataFormatCode.RationalU:
            {
                if (componentCount == 1)
                {
                    handler.SetRational(tagId, new Rational(reader.GetUInt32(tagValueOffset), reader.GetUInt32(tagValueOffset + 4)));
                }
                else if (componentCount > 1)
                {
                    var array = new Rational[componentCount];
                    for (var i = 0; i < componentCount; i++)
                    {
                        array[i] = new Rational(reader.GetUInt32(tagValueOffset + 8 * i), reader.GetUInt32(tagValueOffset + 4 + 8 * i));
                    }
                    handler.SetRationalArray(tagId, array);
                }
                break;
            }

            case TiffDataFormatCode.Single:
            {
                if (componentCount == 1)
                {
                    handler.SetFloat(tagId, reader.GetFloat32(tagValueOffset));
                }
                else
                {
                    var array = new float[componentCount];
                    for (var i = 0; i < componentCount; i++)
                    {
                        array[i] = reader.GetFloat32(tagValueOffset + i * 4);
                    }
                    handler.SetFloatArray(tagId, array);
                }
                break;
            }

            case TiffDataFormatCode.Double:
            {
                if (componentCount == 1)
                {
                    handler.SetDouble(tagId, reader.GetDouble64(tagValueOffset));
                }
                else
                {
                    var array = new double[componentCount];
                    for (var i = 0; i < componentCount; i++)
                    {
                        array[i] = reader.GetDouble64(tagValueOffset + i * 4);
                    }
                    handler.SetDoubleArray(tagId, array);
                }
                break;
            }

            case TiffDataFormatCode.Int8S:
            {
                if (componentCount == 1)
                {
                    handler.SetInt8S(tagId, reader.GetSByte(tagValueOffset));
                }
                else
                {
                    var array = new sbyte[componentCount];
                    for (var i = 0; i < componentCount; i++)
                    {
                        array[i] = reader.GetSByte(tagValueOffset + i);
                    }
                    handler.SetInt8SArray(tagId, array);
                }
                break;
            }

            case TiffDataFormatCode.Int8U:
            {
                if (componentCount == 1)
                {
                    handler.SetInt8U(tagId, reader.GetByte(tagValueOffset));
                }
                else
                {
                    var array = new byte[componentCount];
                    for (var i = 0; i < componentCount; i++)
                    {
                        array[i] = reader.GetByte(tagValueOffset + i);
                    }
                    handler.SetInt8UArray(tagId, array);
                }
                break;
            }

            case TiffDataFormatCode.Int16S:
            {
                if (componentCount == 1)
                {
                    handler.SetInt16S(tagId, reader.GetInt16(tagValueOffset));
                }
                else
                {
                    var array = new short[componentCount];
                    for (var i = 0; i < componentCount; i++)
                    {
                        array[i] = reader.GetInt16(tagValueOffset + i * 2);
                    }
                    handler.SetInt16SArray(tagId, array);
                }
                break;
            }

            case TiffDataFormatCode.Int16U:
            {
                if (componentCount == 1)
                {
                    handler.SetInt16U(tagId, reader.GetUInt16(tagValueOffset));
                }
                else
                {
                    var array = new ushort[componentCount];
                    for (var i = 0; i < componentCount; i++)
                    {
                        array[i] = reader.GetUInt16(tagValueOffset + i * 2);
                    }
                    handler.SetInt16UArray(tagId, array);
                }
                break;
            }

            case TiffDataFormatCode.Int32S:
            {
                // NOTE 'long' in this case means 32 bit, not 64
                if (componentCount == 1)
                {
                    handler.SetInt32S(tagId, reader.GetInt32(tagValueOffset));
                }
                else
                {
                    var array = new int[componentCount];
                    for (var i = 0; i < componentCount; i++)
                    {
                        array[i] = reader.GetInt32(tagValueOffset + i * 4);
                    }
                    handler.SetInt32SArray(tagId, array);
                }
                break;
            }

            case TiffDataFormatCode.Int32U:
            {
                // NOTE 'long' in this case means 32 bit, not 64
                if (componentCount == 1)
                {
                    handler.SetInt32U(tagId, reader.GetUInt32(tagValueOffset));
                }
                else
                {
                    var array = new uint[componentCount];
                    for (var i = 0; i < componentCount; i++)
                    {
                        array[i] = reader.GetUInt32(tagValueOffset + i * 4);
                    }
                    handler.SetInt32UArray(tagId, array);
                }
                break;
            }

            default:
            {
                handler.Error($"Invalid TIFF tag format code {formatCode} for tag 0x{tagId:X4}");
                break;
            }
            }
        }
 /// <exception cref="System.IO.IOException"/>
 private static void ProcessTag([NotNull] ITiffHandler handler, int tagId, int tagValueOffset, int componentCount, TiffDataFormatCode formatCode, [NotNull] IndexedReader reader)
 {
     switch (formatCode)
     {
         case TiffDataFormatCode.Undefined:
         {
             // this includes exif user comments
             handler.SetByteArray(tagId, reader.GetBytes(tagValueOffset, componentCount));
             break;
         }
         case TiffDataFormatCode.String:
         {
             handler.SetString(tagId, reader.GetNullTerminatedStringValue(tagValueOffset, componentCount));
             break;
         }
         case TiffDataFormatCode.RationalS:
         {
             if (componentCount == 1)
             {
                 handler.SetRational(tagId, new Rational(reader.GetInt32(tagValueOffset), reader.GetInt32(tagValueOffset + 4)));
             }
             else if (componentCount > 1)
             {
                 var array = new Rational[componentCount];
                 for (var i = 0; i < componentCount; i++)
                     array[i] = new Rational(reader.GetInt32(tagValueOffset + (8 * i)), reader.GetInt32(tagValueOffset + 4 + (8 * i)));
                 handler.SetRationalArray(tagId, array);
             }
             break;
         }
         case TiffDataFormatCode.RationalU:
         {
             if (componentCount == 1)
             {
                 handler.SetRational(tagId, new Rational(reader.GetUInt32(tagValueOffset), reader.GetUInt32(tagValueOffset + 4)));
             }
             else if (componentCount > 1)
             {
                 var array = new Rational[componentCount];
                 for (var i = 0; i < componentCount; i++)
                     array[i] = new Rational(reader.GetUInt32(tagValueOffset + (8 * i)), reader.GetUInt32(tagValueOffset + 4 + (8 * i)));
                 handler.SetRationalArray(tagId, array);
             }
             break;
         }
         case TiffDataFormatCode.Single:
         {
             if (componentCount == 1)
             {
                 handler.SetFloat(tagId, reader.GetFloat32(tagValueOffset));
             }
             else
             {
                 var array = new float[componentCount];
                 for (var i = 0; i < componentCount; i++)
                     array[i] = reader.GetFloat32(tagValueOffset + (i * 4));
                 handler.SetFloatArray(tagId, array);
             }
             break;
         }
         case TiffDataFormatCode.Double:
         {
             if (componentCount == 1)
             {
                 handler.SetDouble(tagId, reader.GetDouble64(tagValueOffset));
             }
             else
             {
                 var array = new double[componentCount];
                 for (var i = 0; i < componentCount; i++)
                     array[i] = reader.GetDouble64(tagValueOffset + (i * 4));
                 handler.SetDoubleArray(tagId, array);
             }
             break;
         }
         case TiffDataFormatCode.Int8S:
         {
             if (componentCount == 1)
             {
                 handler.SetInt8S(tagId, reader.GetSByte(tagValueOffset));
             }
             else
             {
                 var array = new sbyte[componentCount];
                 for (var i = 0; i < componentCount; i++)
                     array[i] = reader.GetSByte(tagValueOffset + i);
                 handler.SetInt8SArray(tagId, array);
             }
             break;
         }
         case TiffDataFormatCode.Int8U:
         {
             if (componentCount == 1)
             {
                 handler.SetInt8U(tagId, reader.GetByte(tagValueOffset));
             }
             else
             {
                 var array = new byte[componentCount];
                 for (var i = 0; i < componentCount; i++)
                     array[i] = reader.GetByte(tagValueOffset + i);
                 handler.SetInt8UArray(tagId, array);
             }
             break;
         }
         case TiffDataFormatCode.Int16S:
         {
             if (componentCount == 1)
             {
                 handler.SetInt16S(tagId, reader.GetInt16(tagValueOffset));
             }
             else
             {
                 var array = new short[componentCount];
                 for (var i = 0; i < componentCount; i++)
                     array[i] = reader.GetInt16(tagValueOffset + (i * 2));
                 handler.SetInt16SArray(tagId, array);
             }
             break;
         }
         case TiffDataFormatCode.Int16U:
         {
             if (componentCount == 1)
             {
                 handler.SetInt16U(tagId, reader.GetUInt16(tagValueOffset));
             }
             else
             {
                 var array = new ushort[componentCount];
                 for (var i = 0; i < componentCount; i++)
                     array[i] = reader.GetUInt16(tagValueOffset + (i * 2));
                 handler.SetInt16UArray(tagId, array);
             }
             break;
         }
         case TiffDataFormatCode.Int32S:
         {
             // NOTE 'long' in this case means 32 bit, not 64
             if (componentCount == 1)
             {
                 handler.SetInt32S(tagId, reader.GetInt32(tagValueOffset));
             }
             else
             {
                 var array = new int[componentCount];
                 for (var i = 0; i < componentCount; i++)
                     array[i] = reader.GetInt32(tagValueOffset + (i * 4));
                 handler.SetInt32SArray(tagId, array);
             }
             break;
         }
         case TiffDataFormatCode.Int32U:
         {
             // NOTE 'long' in this case means 32 bit, not 64
             if (componentCount == 1)
             {
                 handler.SetInt32U(tagId, reader.GetUInt32(tagValueOffset));
             }
             else
             {
                 var array = new uint[componentCount];
                 for (var i = 0; i < componentCount; i++)
                     array[i] = reader.GetUInt32(tagValueOffset + (i * 4));
                 handler.SetInt32UArray(tagId, array);
             }
             break;
         }
         default:
         {
             handler.Error($"Invalid TIFF tag format code {formatCode} for tag 0x{tagId:X4}");
             break;
         }
     }
 }
 private TiffDataFormat([NotNull] string name, TiffDataFormatCode tiffFormatCode, int componentSizeBytes)
 {
     Name = name;
     TiffFormatCode = tiffFormatCode;
     ComponentSizeBytes = componentSizeBytes;
 }
 public abstract bool TryCustomProcessFormat(int tagId, TiffDataFormatCode formatCode, uint componentCount, out long byteCount);