Beispiel #1
0
        private IGalleryObjectMetadataItem GetExposureProgramMetadataItem()
        {
            IGalleryObjectMetadataItem mdi = null;
            MetadataItem rawMdi            = null;

            if (RawMetadata.TryGetValue(RawMetadataItemName.ExifExposureProg, out rawMdi))
            {
                if (rawMdi.ExtractedValueType == ExtractedValueType.Int64)
                {
                    ExposureProgram expProgram = (ExposureProgram)(Int64)rawMdi.Value;
                    if (MetadataEnumHelper.IsValidExposureProgram(expProgram))
                    {
                        mdi = new GalleryObjectMetadataItem(int.MinValue, FormattedMetadataItemName.ExposureProgram, Resources.Metadata_ExposureProgram, expProgram.ToString(), true);
                    }
                }
            }
            return(mdi);
        }
Beispiel #2
0
        private void /*List<ImageInformation>*/ GetImagesUponMyCriteria(string path, ISO iso, Date date, ExposureTime et, ExposureProgram ep, Orientation or, bool isDSC, string camName, bool isManualWhiteBalance, bool isFlash, bool isGeo, bool isEdit, CancellationToken token)
        {
            Debug.Assert(String.IsNullOrWhiteSpace(path) == false, "Передана пустая  строка в GetAllImages()");

            // List<ImageInformation> result = new List<ImageInformation>();
            string[] dirs  = null;
            string[] files = null;
            try
            {
                /* string[]*/ dirs  = System.IO.Directory.GetDirectories(path);
                /* string[]*/ files = System.IO.Directory.GetFiles(path, "*.*").Where((s) => s.ToLower().EndsWith(".jpg") || s.ToLower().EndsWith(".jpeg")).ToArray();
            }
            catch (IOException ioe)
            {
                Console.WriteLine(ioe.Message);

                Trace.WriteLine(ioe.Message);
                //выясним, не извлекли ли съемный диск

                DriveInfo drive = new DriveInfo(System.IO.Path.GetPathRoot(path));
                if (!drive.IsReady)
                {
                    Console.WriteLine("Диск " + drive.Name + " был извлечен, или содержит ошибки, мешаюшие поиску");
                    Trace.WriteLine("Диск " + drive.Name + " был извлечен, или содержит ошибки, мешаюшие поиску");
                    return /*result*/;
                }
                if (dirs == null || files == null)
                {
                    Trace.WriteLine("Массивы со списком файлов или папок - null");
                    return /*result*/;
                }
            }

            ChangeFolder?.Invoke(new SearchChangeFolderEventArgs(path, files.Length));

            foreach (var f in files)
            {
                if (token.IsCancellationRequested)
                {
                    return;// result;
                }
                try
                {
                    var dirsPhoto = MetadataExtractor.ImageMetadataReader.ReadMetadata(Path.GetFullPath(f));
                    if (isMatch(f, dirsPhoto, iso, date, et, ep, or, isDSC, camName, isManualWhiteBalance, isFlash, isGeo, isEdit))
                    {
                        ImageInformation ciexif = new ImageInformation(f, dirsPhoto);
                        // result.Add(ciexif);
                        NewFile?.Invoke(new SearchNewFileEventArgs(ciexif));
                    }
                }
                catch (ImageProcessingException ipe)
                {
                    Console.WriteLine(ipe.Message);
                    Trace.WriteLine(ipe.Message);
                }
                catch (IOException ioe)
                {
                    Console.WriteLine(ioe.Message);

                    Trace.WriteLine(ioe.Message);
                    //выясним, не извлекли ли съемный диск
                    DriveInfo drive = new DriveInfo(System.IO.Path.GetPathRoot(f));
                    if (!drive.IsReady)
                    {
                        Console.WriteLine("Диск " + drive.Name + " был извлечен, или содержит ошибки, мешаюшие поиску");
                        Trace.WriteLine("Диск " + drive.Name + " был извлечен, или содержит ошибки, мешаюшие поиску");
                        IOFatalError?.Invoke(this, new EventArgs());
                        return; //result;
                    }
                }
                catch (UnauthorizedAccessException uae)
                {
                    Trace.WriteLine(uae.Message);
                }
            }

            foreach (var d in dirs)
            {
                if ((windirSkipFlag == false) && (systemDirectoryScan == false))
                {
                    if (d.Contains(Environment.GetFolderPath(Environment.SpecialFolder.Windows)))
                    {
                        Trace.WriteLine("Пропуск системного каталога...");
                        windirSkipFlag = true;
                        continue;
                    }
                }

                if (token.IsCancellationRequested)
                {
                    return;// result;
                }
                try
                {
                    //result.AddRange(GetImagesUponMyCriteria(d,iso,date,et,ep,or,isDSC, camName, isManualWhiteBalance,isFlash,isGeo,isEdit, token));
                    GetImagesUponMyCriteria(d, iso, date, et, ep, or, isDSC, camName, isManualWhiteBalance, isFlash, isGeo, isEdit, token);
                }
                catch (UnauthorizedAccessException uae)
                {
                    Trace.WriteLine(uae.Message);
                }
            }

            // return result;
        }
Beispiel #3
0
        /* главная функция поиска всех изображений по заданному пути */
        public async Task /*Task<List<ImageInformation>>*/ GetImagesWithMyParams(ISO iso, Date date, ExposureTime et, ExposureProgram ep, Orientation or, bool isDSC, string camName, bool isManualWhiteBalance, bool isFlash, bool isGeo, bool isEdit, CancellationToken token)
        {
            if (!allDrives)
            {
                Trace.WriteLine("Начат поиск в " + path);
                /* return*/ await Task.Run(() => /*ImageList = */ GetImagesUponMyCriteria(path, iso, date, et, ep, or, isDSC, camName, isManualWhiteBalance, isFlash, isGeo, isEdit, token), token);
            }

            else
            {
                Trace.WriteLine("Начат поиск по всему компьютеру");
                DriveInfo[] readyDrives = DriveInfo.GetDrives().Where((d) => d.IsReady).ToArray();
                //  ImageList = new List<ImageInformation>(50);
                /*return*/ await Task.Run(() =>
                {
                    foreach (var d in readyDrives)
                    {
                        if (token.IsCancellationRequested)
                        {
                            break;
                        }
                        if (d.IsReady)
                        {
                            Trace.WriteLine("Поиск по диску " + d.RootDirectory.FullName);
                            //   ImageList.AddRange(GetImagesUponMyCriteria(d.RootDirectory.FullName, iso, date, et, ep, or, isDSC, camName, isManualWhiteBalance, isFlash, isGeo, isEdit, token));
                            GetImagesUponMyCriteria(d.RootDirectory.FullName, iso, date, et, ep, or, isDSC, camName, isManualWhiteBalance, isFlash, isGeo, isEdit, token);
                        }
                        else
                        {
                            Trace.WriteLine("Диск " + d.Name + " был доступен в начале сканирования, но оказался недоступен в дальнейшем. Не сканировался.");
                        }
                    }
                    //   return ImageList;
                }, token);
            }
        }
Beispiel #4
0
        //---bool-версия 27.08.18
        public bool isMatch(string fileName, IReadOnlyList <MetadataExtractor.Directory> imgExif, ISO iso, Date date, ExposureTime et, ExposureProgram ep, Orientation or, bool isDSC, string camName, bool isManualWhiteBalance, bool isFlash, bool isGeo, bool isEdit /* CancellationToken token*/)
        {
            if (iso == null && date == null && et == null && camName == null && isDSC == false && isManualWhiteBalance == false && isFlash == false && isGeo == false && isEdit == false && ep == ExposureProgram.Any && or == Orientation.Any)
            {
                return(true); // критериев нет, подойдет любое
            }
            var subdir = imgExif.OfType <ExifSubIfdDirectory>().FirstOrDefault();
            var dir    = imgExif.OfType <ExifIfd0Directory>().FirstOrDefault();


            if (subdir == null && dir == null) // нет нужных метаданыых
            {
                Trace.WriteLine(fileName + ": нет метаданных");
                return(false);
            }

            if (iso != null) //ISO
            {
                if (subdir == null)
                {
                    return(false);
                }

                Debug.Assert(iso.minISO <= iso.maxISO, "Минимальное ISO больше максимального");

                try
                {
                    if (!subdir.ContainsTag(ExifDirectoryBase.TagIsoEquivalent))
                    {
                        return(false);
                    }

                    ushort iIso = subdir.GetUInt16(ExifDirectoryBase.TagIsoEquivalent);

                    if (!((iIso >= iso.minISO) && (iIso <= iso.maxISO)))
                    {
                        return(false);
                    }
                }
                catch (MetadataException me)
                {
                    Trace.WriteLine(fileName + " " + me.Message);
                    return(false);
                }
            }

            if (et != null) //время выдержки
            {
                if (subdir == null)
                {
                    return(false);
                }
                try
                {
                    if (!subdir.ContainsTag(ExifDirectoryBase.TagExposureTime))
                    {
                        return(false);
                    }

                    Rational expTime  = subdir.GetRational(ExifDirectoryBase.TagExposureTime);
                    double   dExpTime = expTime.ToDouble();
                    double   dMinET   = et.minET.ToDouble();
                    double   dMaxET   = et.maxET.ToDouble();
                    Debug.Assert(dMinET <= dMaxET, "Минимальная выдержка больше минимальной");
                    if (!((dExpTime >= dMinET) && (dExpTime <= dMaxET)))
                    {
                        return(false);
                    }
                }
                catch (MetadataException me)
                {
                    Trace.WriteLine(fileName + " " + me.Message);
                    return(false);
                }
            }

            if (ep != ExposureProgram.Any) //программа экспозиции
            {
                if (subdir == null)
                {
                    return(false);
                }
                try
                {
                    ushort eProgram = subdir.GetUInt16(ExifDirectoryBase.TagExposureProgram);
                    if (eProgram != (ushort)ep)
                    {
                        return(false);
                    }
                }
                catch (MetadataException me)
                {
                    Trace.WriteLine(fileName + " " + me.Message);
                    return(false);
                }
            }

            if (or != Orientation.Any) //ориентация изображения
            {
                if (dir == null)
                {
                    return(false);
                }
                try
                {
                    // var ifd0dir = imgExif.OfType<ExifIfd0Directory>().FirstOrDefault();
                    if (!dir.ContainsTag(ExifDirectoryBase.TagOrientation))
                    {
                        return(false);
                    }

                    ushort orient = dir.GetUInt16(ExifDirectoryBase.TagOrientation);

                    if (or == Orientation.Horizonatal)
                    {
                        if (!(orient > 0 && orient <= 4))
                        {
                            return(false);
                        }
                    }
                    if (or == Orientation.Vertical)
                    {
                        if (!(orient > 4 && orient <= 8))
                        {
                            return(false);
                        }
                    }
                }
                catch (Exception e)
                {
                    Trace.WriteLine(fileName + " " + e.Message);
                    return(false);
                }
            }

            if (isDSC) //источник сканирования
            {
                if (subdir == null)
                {
                    return(false);
                }
                try
                {
                    if (!subdir.ContainsTag(ExifDirectoryBase.TagFileSource))
                    {
                        return(false);
                    }
                    ushort fs = subdir.GetUInt16(ExifDirectoryBase.TagFileSource);

                    if (fs != 3)
                    {
                        return(false);
                    }
                }
                catch (Exception e)
                {
                    Trace.WriteLine(fileName + " " + e.Message);
                    return(false);
                }
            }

            if (camName != null) //камера
            {
                Debug.Assert(!string.IsNullOrWhiteSpace(camName), "Пришло пустое имя камеры");
                if (dir == null)
                {
                    return(false);
                }
                try
                {
                    //  var subifd0dir = imgExif.OfType<ExifIfd0Directory>().FirstOrDefault();
                    if (!dir.ContainsTag(ExifIfd0Directory.TagMake))
                    {
                        return(false);
                    }

                    string cam = dir.GetDescription(ExifIfd0Directory.TagMake).ToLower();
                    if (!(cam.Contains(camName.ToLower())))
                    {
                        return(false);
                    }
                }
                catch (Exception e)
                {
                    Trace.WriteLine(fileName + " " + e.Message);
                    return(false);
                }
            }

            if (date != null) //дата
            {
                Debug.Assert(date.minDT <= date.maxDT, "Конечная дата раньше начальной");
                if (subdir == null)
                {
                    return(false);
                }
                try
                {
                    if (!subdir.ContainsTag(ExifDirectoryBase.TagDateTimeOriginal))
                    {
                        return(false);
                    }

                    DateTime dDate = subdir.GetDateTime(ExifDirectoryBase.TagDateTimeOriginal);
                    dDate = dDate.Date;
                    if (!((dDate >= date.minDT) && (dDate <= date.maxDT)))
                    {
                        return(false);
                    }
                }
                catch (MetadataException me)
                {
                    Trace.WriteLine(fileName + " " + me.Message);
                    return(false);
                }
            }

            if (isManualWhiteBalance) //баланс белого
            {
                if (subdir == null)
                {
                    return(false);
                }
                try
                {
                    if (!subdir.ContainsTag(ExifDirectoryBase.TagWhiteBalanceMode))
                    {
                        return(false);
                    }

                    ushort whiteBalance = subdir.GetUInt16(ExifDirectoryBase.TagWhiteBalanceMode);
                    if (!(whiteBalance == 1))
                    {
                        return(false);
                    }
                }
                catch (MetadataException me)
                {
                    Trace.WriteLine(fileName + " " + me.Message);
                    return(false);
                }
            }

            if (isFlash) //наличие вспышки
            {
                if (subdir == null)
                {
                    return(false);
                }
                try
                {
                    if (!subdir.ContainsTag(ExifDirectoryBase.TagFlash))
                    {
                        return(false);
                    }

                    ushort iFlash = subdir.GetUInt16(ExifDirectoryBase.TagFlash);
                    if (!((iFlash & 0x1) == 1))
                    {
                        return(false);
                    }
                }
                catch (MetadataException me)
                {
                    Trace.WriteLine(fileName + " " + me.Message);
                    return(false);
                }
            }

            if (isGeo) //наличие геометки
            {
                var gpsdir = imgExif.OfType <GpsDirectory>().FirstOrDefault();

                if (gpsdir == null)
                {
                    return(false);
                }
                else
                {
                    if (gpsdir.GetGeoLocation() == null)
                    {
                        return(false);
                    }
                }
            }

            if (isEdit) //редактирован
            {
                try
                {
                    if (!dir.ContainsTag(ExifDirectoryBase.TagSoftware))
                    {
                        return(false);
                    }

                    string   softWare = dir?.GetDescription(ExifDirectoryBase.TagSoftware);
                    string[] soft     = { "gimp", "photoshop", "lightroom", "luminar", "affinity", "paint", "krita", "pinta", "picasa", "movavi", "pixbuilder" };
                    if (softWare == null)
                    {
                        return(false);
                    }
                    else
                    {
                        bool edit_flag = false;
                        foreach (var s in soft)
                        {
                            if (softWare.ToLower().Contains(s) == true)
                            {
                                edit_flag = true;
                                continue;
                            }
                        }
                        if (edit_flag == false)
                        {
                            return(false);
                        }
                    }
                }
                catch (MetadataException me)
                {
                    Trace.WriteLine(fileName + " " + me.Message);
                    return(false);
                }
            }
            return(true);
        }
Beispiel #5
0
        Tag CreateSpecificTag(TagInfo info, string numberValue)
        {
            try
            {
                if (info.IsGps)
                {
                    switch (info.Name.ToLower())
                    {
                    case "gpslatituderef":
                        return(new Tag <GpsLatitudeRef> {
                            TypedValue = GpsLatitudeRef.FromKey(numberValue)
                        });

                    case "gpslongituderef":
                        return(new Tag <GpsLongitudeRef> {
                            TypedValue = GpsLongitudeRef.FromKey(numberValue)
                        });

                    case "gpsaltituderef":
                        return(new Tag <GpsAltitudeRef> {
                            TypedValue = GpsAltitudeRef.FromKey(byte.Parse(numberValue))
                        });

                    case "gpsstatus":
                        return(new Tag <GpsStatus> {
                            TypedValue = GpsStatus.FromKey(numberValue)
                        });

                    case "gpsmeasuremode":
                        return(new Tag <GpsMeasureMode> {
                            TypedValue = GpsMeasureMode.FromKey(numberValue)
                        });

                    case "gpsspeedref":
                        return(new Tag <GpsSpeedRef> {
                            TypedValue = GpsSpeedRef.FromKey(numberValue)
                        });

                    case "gpstrackref":
                        return(new Tag <GpsTrackRef> {
                            TypedValue = GpsTrackRef.FromKey(numberValue)
                        });

                    case "gpsimgdirectionref":
                        return(new Tag <GpsImgDirectionRef> {
                            TypedValue = GpsImgDirectionRef.FromKey(numberValue)
                        });

                    case "gpsdestlatituderef":
                        return(new Tag <GpsDestLatitudeRef> {
                            TypedValue = GpsDestLatitudeRef.FromKey(numberValue)
                        });

                    case "gpsdestlongituderef":
                        return(new Tag <GpsDestLongitudeRef> {
                            TypedValue = GpsDestLongitudeRef.FromKey(numberValue)
                        });

                    case "gpsdestbearingref":
                        return(new Tag <GpsDestBearingRef> {
                            TypedValue = GpsDestBearingRef.FromKey(numberValue)
                        });

                    case "gpsdestdistanceref":
                        return(new Tag <GpsDestDistanceRef> {
                            TypedValue = GpsDestDistanceRef.FromKey(numberValue)
                        });

                    case "gpsdifferential":
                        return(new Tag <GpsDifferential> {
                            TypedValue = GpsDifferential.FromKey(ushort.Parse(numberValue))
                        });
                    }
                }

                if (info.IsNikon)
                {
                    switch (info.Name.ToLower())
                    {
                    case "colorspace":
                        return(new Tag <NikonColorSpace> {
                            TypedValue = NikonColorSpace.FromKey(ushort.Parse(numberValue))
                        });

                    case "vibrationreduction":
                        return(new Tag <NikonVibrationReduction> {
                            TypedValue = NikonVibrationReduction.FromKey(byte.Parse(numberValue))
                        });

                    case "vrmode":
                        return(new Tag <NikonVRMode> {
                            TypedValue = NikonVRMode.FromKey(byte.Parse(numberValue))
                        });

                    case "imageauthentication":
                        return(new Tag <NikonImageAuthentication> {
                            TypedValue = NikonImageAuthentication.FromKey(byte.Parse(numberValue))
                        });

                    case "actived-lighting":
                        return(new Tag <NikonActiveDLighting> {
                            TypedValue = NikonActiveDLighting.FromKey(ushort.Parse(numberValue))
                        });

                    case "picturecontroladjust":
                        return(new Tag <NikonPictureControlAdjust> {
                            TypedValue = NikonPictureControlAdjust.FromKey(byte.Parse(numberValue))
                        });

                    case "filtereffect":
                        return(new Tag <NikonFilterEffect> {
                            TypedValue = NikonFilterEffect.FromKey(byte.Parse(numberValue))
                        });

                    case "toningeffect":
                        return(new Tag <NikonToningEffect> {
                            TypedValue = NikonToningEffect.FromKey(byte.Parse(numberValue))
                        });

                    case "daylightsavings":
                        return(new Tag <NikonDaylightSavings> {
                            TypedValue = NikonDaylightSavings.FromKey(byte.Parse(numberValue))
                        });

                    case "datedisplayformat":
                        return(new Tag <NikonDateDisplayFormat> {
                            TypedValue = NikonDateDisplayFormat.FromKey(byte.Parse(numberValue))
                        });

                    case "isoexpansion":
                        return(new Tag <NikonIsoExpansion> {
                            TypedValue = NikonIsoExpansion.FromKey(ushort.Parse(numberValue))
                        });

                    case "isoexpansion2":
                        return(new Tag <NikonIsoExpansion2> {
                            TypedValue = NikonIsoExpansion2.FromKey(ushort.Parse(numberValue))
                        });

                    case "vignettecontrol":
                        return(new Tag <NikonVignetteControl> {
                            TypedValue = NikonVignetteControl.FromKey(ushort.Parse(numberValue))
                        });

                    case "autodistortioncontrol":
                        return(new Tag <NikonAutoDistortionControl> {
                            TypedValue = NikonAutoDistortionControl.FromKey(byte.Parse(numberValue))
                        });

                    case "hdr":
                        return(new Tag <NikonHdr> {
                            TypedValue = NikonHdr.FromKey(byte.Parse(numberValue))
                        });

                    case "hdrlevel":
                        return(new Tag <NikonHdrLevel> {
                            TypedValue = NikonHdrLevel.FromKey(byte.Parse(numberValue))
                        });

                    case "hdrsmoothing":
                        return(new Tag <NikonHdrSmoothing> {
                            TypedValue = NikonHdrSmoothing.FromKey(byte.Parse(numberValue))
                        });

                    case "hdrlevel2":
                        return(new Tag <NikonHdrLevel2> {
                            TypedValue = NikonHdrLevel2.FromKey(byte.Parse(numberValue))
                        });

                    case "textencoding":
                        return(new Tag <NikonTextEncoding> {
                            TypedValue = NikonTextEncoding.FromKey(byte.Parse(numberValue))
                        });

                    case "flashmode":
                        return(new Tag <NikonFlashMode> {
                            TypedValue = NikonFlashMode.FromKey(byte.Parse(numberValue))
                        });

                    case "afareamode":
                        return(new Tag <NikonAfAreaMode> {
                            TypedValue = NikonAfAreaMode.FromKey(byte.Parse(numberValue))
                        });

                    case "afpoint":
                        return(new Tag <NikonAfPoint> {
                            TypedValue = NikonAfPoint.FromKey(byte.Parse(numberValue))
                        });

                    case "afpointsinfocus":
                        return(new Tag <NikonAfPointsInFocus> {
                            TypedValue = NikonAfPointsInFocus.FromKey(ushort.Parse(numberValue))
                        });

                    case "nefcompression":
                        return(new Tag <NikonNefCompression> {
                            TypedValue = NikonNefCompression.FromKey(ushort.Parse(numberValue))
                        });

                    case "retouchhistory":
                        return(new Tag <NikonRetouchHistory> {
                            TypedValue = NikonRetouchHistory.FromKey(ushort.Parse(numberValue))
                        });

                    case "flashsource":
                        return(new Tag <NikonFlashSource> {
                            TypedValue = NikonFlashSource.FromKey(byte.Parse(numberValue))
                        });

                    case "flashcolorfilter":
                        return(new Tag <NikonFlashColorFilter> {
                            TypedValue = NikonFlashColorFilter.FromKey(byte.Parse(numberValue))
                        });

                    case "highisonoisereduction":
                        return(new Tag <NikonHighIsoNoiseReduction> {
                            TypedValue = NikonHighIsoNoiseReduction.FromKey(ushort.Parse(numberValue))
                        });
                    }
                }

                if (info.IsExif)
                {
                    switch (info.Name.ToLower())
                    {
                    case "interopindex":
                        return(new Tag <InteropIndex> {
                            TypedValue = InteropIndex.FromKey(numberValue)
                        });

                    case "subfiletype":
                        return(new Tag <SubfileType> {
                            TypedValue = SubfileType.FromKey(uint.Parse(numberValue))
                        });

                    case "oldsubfiletype":
                        return(new Tag <OldSubfileType> {
                            TypedValue = OldSubfileType.FromKey(ushort.Parse(numberValue))
                        });

                    case "compression":
                        return(new Tag <Compression> {
                            TypedValue = Compression.FromKey(ushort.Parse(numberValue))
                        });

                    case "photometricinterpretation":
                        return(new Tag <PhotometricInterpretation> {
                            TypedValue = PhotometricInterpretation.FromKey(ushort.Parse(numberValue))
                        });

                    case "thresholding":
                        return(new Tag <Thresholding> {
                            TypedValue = Thresholding.FromKey(ushort.Parse(numberValue))
                        });

                    case "fillorder":
                        return(new Tag <FillOrder> {
                            TypedValue = FillOrder.FromKey(ushort.Parse(numberValue))
                        });

                    case "orientation":
                        return(new Tag <Orientation> {
                            TypedValue = Orientation.FromKey(ushort.Parse(numberValue))
                        });

                    case "planarconfiguration":
                        return(new Tag <PlanarConfiguration> {
                            TypedValue = PlanarConfiguration.FromKey(ushort.Parse(numberValue))
                        });

                    case "grayresponseunit":
                        return(new Tag <GrayResponseUnit> {
                            TypedValue = GrayResponseUnit.FromKey(ushort.Parse(numberValue))
                        });

                    case "resolutionunit":
                        return(new Tag <ResolutionUnit> {
                            TypedValue = ResolutionUnit.FromKey(ushort.Parse(numberValue))
                        });

                    case "predictor":
                        return(new Tag <Predictor> {
                            TypedValue = Predictor.FromKey(ushort.Parse(numberValue))
                        });

                    case "cleanfaxdata":
                        return(new Tag <CleanFaxData> {
                            TypedValue = CleanFaxData.FromKey(ushort.Parse(numberValue))
                        });

                    case "inkset":
                        return(new Tag <InkSet> {
                            TypedValue = InkSet.FromKey(ushort.Parse(numberValue))
                        });

                    case "extrasamples":
                        return(new Tag <ExtraSamples> {
                            TypedValue = ExtraSamples.FromKey(ushort.Parse(numberValue))
                        });

                    case "sampleformat":
                        return(new Tag <SampleFormat> {
                            TypedValue = SampleFormat.FromKey(ushort.Parse(numberValue))
                        });

                    case "indexed":
                        return(new Tag <Indexed> {
                            TypedValue = Indexed.FromKey(ushort.Parse(numberValue))
                        });

                    case "opiproxy":
                        return(new Tag <OpiProxy> {
                            TypedValue = OpiProxy.FromKey(ushort.Parse(numberValue))
                        });

                    case "profiletype":
                        return(new Tag <ProfileType> {
                            TypedValue = ProfileType.FromKey(ushort.Parse(numberValue))
                        });

                    case "faxprofile":
                        return(new Tag <FaxProfile> {
                            TypedValue = FaxProfile.FromKey(ushort.Parse(numberValue))
                        });

                    case "jpegproc":
                        return(new Tag <JpegProc> {
                            TypedValue = JpegProc.FromKey(ushort.Parse(numberValue))
                        });

                    case "ycbcrsubsampling":
                        return(new Tag <YCbCrSubSampling> {
                            TypedValue = YCbCrSubSampling.FromKey(numberValue)
                        });

                    case "ycbcrpositioning":
                        return(new Tag <YCbCrPositioning> {
                            TypedValue = YCbCrPositioning.FromKey(ushort.Parse(numberValue))
                        });

                    case "sonyrawfiletype":
                        return(new Tag <SonyRawFileType> {
                            TypedValue = SonyRawFileType.FromKey(ushort.Parse(numberValue))
                        });

                    case "rasterpadding":
                        return(new Tag <RasterPadding> {
                            TypedValue = RasterPadding.FromKey(ushort.Parse(numberValue))
                        });

                    case "imagecolorindicator":
                        return(new Tag <ImageColorIndicator> {
                            TypedValue = ImageColorIndicator.FromKey(ushort.Parse(numberValue))
                        });

                    case "backgroundcolorindicator":
                        return(new Tag <BackgroundColorIndicator> {
                            TypedValue = BackgroundColorIndicator.FromKey(ushort.Parse(numberValue))
                        });

                    case "hcusage":
                        return(new Tag <HCUsage> {
                            TypedValue = HCUsage.FromKey(ushort.Parse(numberValue))
                        });

                    case "exposureprogram":
                        return(new Tag <ExposureProgram> {
                            TypedValue = ExposureProgram.FromKey(ushort.Parse(numberValue))
                        });

                    case "sensitivitytype":
                        return(new Tag <SensitivityType> {
                            TypedValue = SensitivityType.FromKey(ushort.Parse(numberValue))
                        });

                    case "componentsconfiguration":
                        return(new Tag <ComponentsConfiguration> {
                            TypedValue = ComponentsConfiguration.FromKey(ushort.Parse(numberValue))
                        });

                    case "meteringmode":
                        return(new Tag <MeteringMode> {
                            TypedValue = MeteringMode.FromKey(ushort.Parse(numberValue))
                        });

                    case "lightsource":
                    case "calibrationilluminant1":
                    case "calibrationilluminant2":
                        return(new Tag <LightSource> {
                            TypedValue = LightSource.FromKey(ushort.Parse(numberValue))
                        });

                    case "flash":
                        return(new Tag <FlashValue> {
                            TypedValue = FlashValue.FromKey(ushort.Parse(numberValue))
                        });

                    case "focalplaneresolutionunit":
                        return(new Tag <FocalPlaneResolutionUnit> {
                            TypedValue = FocalPlaneResolutionUnit.FromKey(ushort.Parse(numberValue))
                        });

                    case "securityclassification":
                        return(new Tag <SecurityClassification> {
                            TypedValue = SecurityClassification.FromKey(numberValue)
                        });

                    case "sensingmethod":
                        return(new Tag <SensingMethod> {
                            TypedValue = SensingMethod.FromKey(ushort.Parse(numberValue))
                        });

                    case "colorspace":
                        return(new Tag <ColorSpace> {
                            TypedValue = ColorSpace.FromKey(ushort.Parse(numberValue))
                        });

                    case "filesource":
                        return(new Tag <FileSource> {
                            TypedValue = FileSource.FromKey(ushort.Parse(numberValue))
                        });

                    case "scenetype":
                        return(new Tag <SceneType> {
                            TypedValue = SceneType.FromKey(ushort.Parse(numberValue))
                        });

                    case "customrendered":
                        return(new Tag <CustomRendered> {
                            TypedValue = CustomRendered.FromKey(ushort.Parse(numberValue))
                        });

                    case "exposuremode":
                        return(new Tag <ExposureMode> {
                            TypedValue = ExposureMode.FromKey(ushort.Parse(numberValue))
                        });

                    case "whitebalance":
                        return(new Tag <WhiteBalance> {
                            TypedValue = WhiteBalance.FromKey(ushort.Parse(numberValue))
                        });

                    case "scenecapturetype":
                        return(new Tag <SceneCaptureType> {
                            TypedValue = SceneCaptureType.FromKey(ushort.Parse(numberValue))
                        });

                    case "gaincontrol":
                        return(new Tag <GainControl> {
                            TypedValue = GainControl.FromKey(ushort.Parse(numberValue))
                        });

                    case "contrast":
                        return(new Tag <Contrast> {
                            TypedValue = Contrast.FromKey(ushort.Parse(numberValue))
                        });

                    case "saturation":
                        return(new Tag <Saturation> {
                            TypedValue = Saturation.FromKey(ushort.Parse(numberValue))
                        });

                    case "sharpness":
                        return(new Tag <Sharpness> {
                            TypedValue = Sharpness.FromKey(ushort.Parse(numberValue))
                        });

                    case "subjectdistancerange":
                        return(new Tag <SubjectDistanceRange> {
                            TypedValue = SubjectDistanceRange.FromKey(ushort.Parse(numberValue))
                        });

                    case "pixelformat":
                        return(new Tag <PixelFormat> {
                            TypedValue = PixelFormat.FromKey(ushort.Parse(numberValue))
                        });

                    case "transformation":
                        return(new Tag <Transformation> {
                            TypedValue = Transformation.FromKey(ushort.Parse(numberValue))
                        });

                    case "uncompressed":
                        return(new Tag <Uncompressed> {
                            TypedValue = Uncompressed.FromKey(ushort.Parse(numberValue))
                        });

                    case "imagedatadiscard":
                        return(new Tag <ImageDataDiscard> {
                            TypedValue = ImageDataDiscard.FromKey(ushort.Parse(numberValue))
                        });

                    case "alphadatadiscard":
                        return(new Tag <AlphaDataDiscard> {
                            TypedValue = AlphaDataDiscard.FromKey(ushort.Parse(numberValue))
                        });

                    case "usptooriginalcontenttype":
                        return(new Tag <USPTOOriginalContentType> {
                            TypedValue = USPTOOriginalContentType.FromKey(ushort.Parse(numberValue))
                        });

                    case "cfalayout":
                        return(new Tag <CFALayout> {
                            TypedValue = CFALayout.FromKey(ushort.Parse(numberValue))
                        });

                    case "makernotesafety":
                        return(new Tag <MakerNoteSafety> {
                            TypedValue = MakerNoteSafety.FromKey(ushort.Parse(numberValue))
                        });

                    case "profileembedpolicy":
                        return(new Tag <ProfileEmbedPolicy> {
                            TypedValue = ProfileEmbedPolicy.FromKey(ushort.Parse(numberValue))
                        });

                    case "previewcolorspace":
                        return(new Tag <PreviewColorSpace> {
                            TypedValue = PreviewColorSpace.FromKey(ushort.Parse(numberValue))
                        });

                    case "profilehuesatmapencoding":
                        return(new Tag <ProfileHueSatMapEncoding> {
                            TypedValue = ProfileHueSatMapEncoding.FromKey(ushort.Parse(numberValue))
                        });

                    case "profilelooktableencoding":
                        return(new Tag <ProfileLookTableEncoding> {
                            TypedValue = ProfileLookTableEncoding.FromKey(ushort.Parse(numberValue))
                        });

                    case "defaultblackrender":
                        return(new Tag <DefaultBlackRender> {
                            TypedValue = DefaultBlackRender.FromKey(ushort.Parse(numberValue))
                        });
                    }
                }

                // ---- VALUE TAG ----
                if (string.IsNullOrEmpty(info.ValueType))
                {
                    return(new Tag());
                }

                switch (info.ValueType.ToLower())
                {
                case "int8u":
                    return(new Tag <byte> {
                        TypedValue = byte.Parse(numberValue)
                    });

                case "int8s":
                    return(new Tag <sbyte> {
                        TypedValue = sbyte.Parse(numberValue)
                    });

                case "int16u":
                    return(new Tag <ushort> {
                        TypedValue = ushort.Parse(numberValue)
                    });

                case "int16s":
                    return(new Tag <short> {
                        TypedValue = short.Parse(numberValue)
                    });

                case "int32u":
                    return(new Tag <uint> {
                        TypedValue = uint.Parse(numberValue)
                    });

                case "integer":
                case "int32s":
                    return(new Tag <int> {
                        TypedValue = int.Parse(numberValue)
                    });

                case "int64u":
                    return(new Tag <ulong> {
                        TypedValue = ulong.Parse(numberValue)
                    });

                case "int64s":
                    return(new Tag <long> {
                        TypedValue = long.Parse(numberValue)
                    });

                case "float":
                case "rational32s":
                case "rational32u":
                    return(new Tag <float> {
                        TypedValue = float.Parse(numberValue)
                    });

                case "double":
                case "rational":
                case "rational64s":
                case "rational64u":
                case "real":
                    return(new Tag <double> {
                        TypedValue = double.Parse(numberValue)
                    });

                case "boolean":
                    return(new Tag <bool> {
                        TypedValue = bool.Parse(numberValue)
                    });
                }
            }
            catch
            {
                if (!Quiet)
                {
                    Console.WriteLine($"error converting {info.TableName}::{info.Id} with name {info.Name}.  Expected type: {info.ValueType} but got value: {numberValue}");
                }
            }

            return(new Tag());
        }
Beispiel #6
0
        private async void StartSearch(object sender, EventArgs e)
        {
            if (System.IO.Directory.Exists(pathTextBox.Text) || allDrivesCheckBox.Checked)
            {
                //формирование критериев поиска
                Date            date    = null;
                ISO             iso     = null;
                ExposureProgram ep      = ExposureProgram.Any;
                Orientation     or      = Orientation.Any;
                ExposureTime    et      = null;
                bool            isDSC   = false;
                string          camName = null;
                bool            isManualWhiteBalance = false;
                bool            isFlashOn            = false;
                bool            isGPS  = false;
                bool            isEdit = false;
                //---------------------------------


                searchSettings.Clear();



                //------ДАТА
                if (datesCheckBox.Checked == true)
                {
                    if (endDateTimePicker.Value.Date < startDateTimePicker.Value.Date)
                    {
                        MessageBox.Show("Неверно выставлены настройки поиска по дате. Пожалуйста исправьте.");
                        return;
                    }
                    searchSettings.AppendLine("Поиск по датам: " + startDateTimePicker.Value.ToShortDateString() + " - " + endDateTimePicker.Value.ToShortDateString());
                    date = new Date(startDateTimePicker.Value.Date, endDateTimePicker.Value.Date);
                }
                //-----ISO
                if (ISOCheckBox.Checked)
                {
                    uint minISO;
                    uint maxISO;
                    bool isMinISOCorrect = uint.TryParse(minISOTextBox.Text, out minISO);
                    bool isMaxISOCorrect = uint.TryParse(maxISOTextBox.Text, out maxISO);
                    if (isMinISOCorrect == true && isMaxISOCorrect == true)
                    {
                        if (maxISO < minISO)
                        {
                            MessageBox.Show("Неверно выставлены настройки поиска по ISO. Пожалуйста исправьте.");
                            return;
                        }
                        if (maxISO > uint.MaxValue)
                        {
                            MessageBox.Show("Неверно выставлены настройки поиска по ISO. Пожалуйста исправьте.");
                            return;
                        }

                        searchSettings.AppendLine("Поиск по ISO: " + minISO + " - " + maxISO);
                        iso = new ISO(minISO, maxISO);
                    }
                    else
                    {
                        MessageBox.Show("Неверно выставлены настройки поиска по ISO. Пожалуйста исправьте.");
                        return;
                    }
                }
                //-----ВЫДЕРЖКА
                if (ExposureTimeCheckBox.Checked)
                {
                    Rational minExposureTime;
                    Rational maxExposureTime;
                    bool     isMinValueCorrect = GetRationalFromString(minExposureTimeTextBox.Text, out minExposureTime);
                    bool     isMaxValueCorrect = GetRationalFromString(maxExposureTimeTextBox.Text, out maxExposureTime);
                    if (isMinValueCorrect == true && isMaxValueCorrect == true)
                    {
                        //теперь проверим на нижние и верхние границы

                        double min = minExposureTime.ToDouble();
                        double max = maxExposureTime.ToDouble();

                        if (!(min <= max + double.Epsilon))
                        {
                            MessageBox.Show("Неверно выставлены настройки поиска по выдержке. Пожалуйста исправьте.");
                            return;
                        }
                        searchSettings.AppendLine("Поиск по выдержке: " + minExposureTime.ToSimpleString() + " - " + maxExposureTime.ToSimpleString());
                        et = new ExposureTime(minExposureTime, maxExposureTime);
                    }
                    else
                    {
                        MessageBox.Show("Неверно выставлены настройки поиска по выдержке. Пожалуйста исправьте.");
                        return;
                    }
                }
                //---МОДЕЛЬ КАМЕРЫ

                if (cameraCheckBox.Checked)
                {
                    if (!string.IsNullOrWhiteSpace(CameraTextBox.Text))
                    {
                        camName = CameraTextBox.Text.Trim().Split(' ')[0];
                        searchSettings.AppendLine("Поиск по модели камеры: " + camName);
                    }
                    else
                    {
                        MessageBox.Show("Неверно выставлены настройки поиска по производителю камеры. Пожалуйста исправьте.");
                        return;
                    }
                }

                if (WhiteBalanceСheckBox.Checked)
                {
                    isManualWhiteBalance = true;
                    searchSettings.AppendLine("Поиск снимков с ручным балансом белого");
                }

                if (flashOnCheckBox.Checked)
                {
                    isFlashOn = true;
                    searchSettings.AppendLine("Поиск снимков со вспышкой");
                }

                if (gpsCheckBox.Checked)
                {
                    isGPS = true;
                    searchSettings.AppendLine("Поиск снимков с геоданными");
                }
                if (EditCheckBox.Checked)
                {
                    isEdit = true;
                    searchSettings.AppendLine("Поиск редактированных снимков");
                }
                if (ExposureProgramCheckBox.Checked)
                {
                    if (exposureProgramComboBox.SelectedIndex == -1)
                    {
                        MessageBox.Show("Неверно выставлены настройки поиска по программе управления экспозицией. Пожалуйста исправьте.");
                        return;
                    }
                    ep = (ExposureProgram)exposureProgramComboBox.SelectedIndex + 1;
                }

                //источник изображения

                if (DSCCheckBox.Checked)
                {
                    isDSC = true;
                    searchSettings.AppendLine("Поиск изображений сделанных только на фотоаппарат");
                }


                if (orientationСheckBox.Checked)
                {
                    int sel = orientationComboBox.SelectedIndex;
                    if (sel == -1)
                    {
                        MessageBox.Show("Неверно выставлены настройки поиска по ориентации. Пожалуйста исправьте.");
                        return;
                    }
                    switch (sel)
                    {
                    case 0:
                        or = Orientation.Horizonatal;
                        break;

                    case 1:
                        or = Orientation.Vertical;
                        break;
                    }
                }

                if (allDrivesCheckBox.Checked)
                {
                    searchSettings.AppendLine("Поиск изображений: весь компьютер");
                    finder = new Search(!skipWinDirectoryCheckBox.Checked);
                }
                else
                {
                    searchSettings.AppendLine("Поиск изображений в: " + pathTextBox.Text);
                    finder = new Search(pathTextBox.Text, !skipWinDirectoryCheckBox.Checked);
                }

                finder.ChangeFolder += ChangeStatus;
                finder.NewFile      += newFileFinded;
                status.Text          = "Выполняется поиск...";

                //---кнопка меняется на "стоп"
                startButton.Text   = "Остановить поиск";
                startButton.Click -= StartSearch;
                startButton.Click += Stop;

                searchToolStripMenuItem.Text   = "Остановить поиск";
                searchToolStripMenuItem.Click -= StartSearch;
                searchToolStripMenuItem.Click += Stop;


                filesListBox.Items.Clear();
                imageInformationTextBox.Clear();

                pictureBox.Image = null;
                imageWorks?.img?.Dispose();


                //---пуск задачи---//
                cancelTokenSource = new CancellationTokenSource();
                token             = cancelTokenSource.Token;


                isWorking = true;
                await finder.GetImagesWithMyParams(iso, date, et, ep, or, isDSC, camName, isManualWhiteBalance, isFlashOn, isGPS, isEdit, token);

                isWorking = false;

                // MessageBox.Show(searchSettings.ToString() + "\nНайдено изображений: " + imagesBindingSource.Count);
                //------------------//
                status.Text = "Поиск окончен";
                // imagesBindingSource.DataSource = images;

                //---кнопка меняется на старт
                startButton.Text   = "Начать поиск";
                startButton.Click += StartSearch;
                startButton.Click -= Stop;

                searchToolStripMenuItem.Text   = "Начать поиск";
                searchToolStripMenuItem.Click += StartSearch;
                searchToolStripMenuItem.Click -= Stop;

                if (WindowState == FormWindowState.Minimized)
                {
                    //мигание значка на панели задач, когда поиск завершен (если окно свернуто)
                    FLASHWINFO fwi = new FLASHWINFO();
                    fwi.cbSize    = Marshal.SizeOf(fwi);
                    fwi.hwnd      = Handle;
                    fwi.dwFlags   = 0x00000002;
                    fwi.dwTimeout = 0;
                    fwi.uCount    = 5;
                    FlashWindowEx(ref fwi);
                }

#if DEBUG
                #region Tests
                Console.WriteLine("Tests...");
                //---тестируем поиск по датам, удалить в релизе
                if (datesCheckBox.Checked)
                {
                    foreach (var i in filesListBox.Items)
                    {
                        var sdir   = ((ImageInformation)i).Directories.OfType <ExifSubIfdDirectory>().FirstOrDefault();
                        var dbdate = sdir.GetDateTime(ExifDirectoryBase.TagDateTimeOriginal).Date;
                        Debug.Assert((dbdate >= startDateTimePicker.Value.Date) && (dbdate <= endDateTimePicker.Value.Date), "DateTime Bug: " + ((ImageInformation)i).FileName);
                    }
                }

                //---тестируем баланс белого (ручной)
                if (WhiteBalanceСheckBox.Checked)
                {
                    foreach (var i in filesListBox.Items)
                    {
                        var sdir = ((ImageInformation)i).Directories.OfType <ExifSubIfdDirectory>().FirstOrDefault();
                        var wb   = sdir.GetUInt16(ExifDirectoryBase.TagWhiteBalanceMode);
                        Debug.Assert(wb == 1, "White Balance Bug: " + ((ImageInformation)i).FileName);
                    }
                }
                //---тестируем источник снимка
                if (DSCCheckBox.Checked)
                {
                    foreach (var i in filesListBox.Items)
                    {
                        var sdir = ((ImageInformation)i).Directories.OfType <ExifSubIfdDirectory>().FirstOrDefault();
                        var dsc  = sdir.GetUInt16(ExifDirectoryBase.TagFileSource);
                        Debug.Assert(dsc == 3, " DSC Bug: " + ((ImageInformation)i).FileName);
                    }
                }

                //---тестируем модель камеры, удалить в релизе
                if (cameraCheckBox.Checked)
                {
                    foreach (var x in filesListBox.Items)
                    {
                        if (x is ImageInformation)
                        {
                            var sdir = ((ImageInformation)x).Directories.OfType <ExifIfd0Directory>().FirstOrDefault();
                            var cam  = sdir.GetDescription(ExifIfd0Directory.TagMake);
                            cam = cam.ToLower();
                            Debug.Assert(cam.Contains(camName.ToLower()), "Неверно отработал поиск по камере" + ((ImageInformation)x).FileName);
                        }
                    }
                }


                //---тестируем выдержку, удалить в релизе
                if (ExposureTimeCheckBox.Checked)
                {
                    foreach (var i in filesListBox.Items)
                    {
                        var sdir = ((ImageInformation)i).Directories.OfType <ExifSubIfdDirectory>().FirstOrDefault();

                        Rational minExposureTime;
                        Rational maxExposureTime;
                        bool     isMinValueCorrect = GetRationalFromString(minExposureTimeTextBox.Text, out minExposureTime);
                        bool     isMaxValueCorrect = GetRationalFromString(maxExposureTimeTextBox.Text, out maxExposureTime);
                        if (isMinValueCorrect == true && isMaxValueCorrect == true)
                        {
                            double min     = minExposureTime.ToDouble();
                            double max     = maxExposureTime.ToDouble();
                            double exptime = sdir.GetRational(ExifDirectoryBase.TagExposureTime).ToDouble();
                            Debug.Assert((exptime >= min - double.Epsilon) && (exptime <= max + double.Epsilon), "Exposure Bug: " + ((ImageInformation)i).FileName + " " + exptime);
                        }
                    }
                }

                //тестируем ISO
                if (ISOCheckBox.Checked)
                {
                    foreach (var i in filesListBox.Items)
                    {
                        var sdir  = ((ImageInformation)i).Directories.OfType <ExifSubIfdDirectory>().FirstOrDefault();
                        var dbiso = sdir.GetUInt16(ExifDirectoryBase.TagIsoEquivalent);
                        Debug.Assert((dbiso >= ushort.Parse(minISOTextBox.Text)) && (dbiso <= ushort.Parse(maxISOTextBox.Text)), "ISO Bug: " + ((ImageInformation)i).FileName);
                    }
                }

                //тестируем вспышку
                if (flashOnCheckBox.Checked)
                {
                    foreach (var i in filesListBox.Items)
                    {
                        var    sdir  = ((ImageInformation)i).Directories.OfType <ExifSubIfdDirectory>().FirstOrDefault();
                        ushort flash = sdir.GetUInt16(ExifDirectoryBase.TagFlash);
                        Debug.Assert((flash & 0x1) != 0, "Flash Bug: " + ((ImageInformation)i).FileName + "Flash value: " + flash);
                    }
                }

                //тестируем программу экспозиции
                if (ExposureProgramCheckBox.Checked)
                {
                    foreach (var i in filesListBox.Items)
                    {
                        var    sdir     = ((ImageInformation)i).Directories.OfType <ExifSubIfdDirectory>().FirstOrDefault();
                        ushort eProgram = sdir.GetUInt16(ExifDirectoryBase.TagExposureProgram);
                        Debug.Assert(eProgram == (int)exposureProgramComboBox.SelectedIndex + 1, "Exposure Program Bug: " + ((ImageInformation)i).FileName + " EP Value: " + eProgram);
                    }
                }

                //тестируем ориентацию
                if (ExposureProgramCheckBox.Checked)
                {
                    foreach (var i in filesListBox.Items)
                    {
                        var    sdir   = ((ImageInformation)i).Directories.OfType <ExifIfd0Directory>().FirstOrDefault();
                        ushort orient = sdir.GetUInt16(ExifDirectoryBase.TagOrientation);

                        if (or == Orientation.Horizonatal)
                        {
                            Debug.Assert(orient <= 4, "Orientation bug");
                        }
                        if (or == Orientation.Vertical)
                        {
                            Debug.Assert(orient > 4, "Orientation bug");
                        }
                    }
                }


                #endregion
#endif
            }
            else
            {
                MessageBox.Show("Путь указан неверно!", "WhereIsMyPhoto");
            }
        }
        /// <summary>
        /// Determines if the specified <see cref="ExposureProgram" /> is one of the defined enumerations. This method is more efficient than using
        /// <see cref="Enum.IsDefined" />, since <see cref="Enum.IsDefined" /> uses reflection.
        /// </summary>
        /// <param name="expProgram">An instance of <see cref="ExposureProgram" /> to test.</param>
        /// <returns>Returns true if <paramref name="expProgram"/> is one of the defined items in the enumeration; otherwise returns false.</returns>
        public static bool IsValidExposureProgram(ExposureProgram expProgram)
        {
            switch (expProgram)
            {
                case ExposureProgram.Action:
                case ExposureProgram.Aperture:
                case ExposureProgram.Creative:
                case ExposureProgram.Landscape:
                case ExposureProgram.Manual:
                case ExposureProgram.Normal:
                case ExposureProgram.Portrait:
                case ExposureProgram.Reserved:
                case ExposureProgram.Shutter:
                case ExposureProgram.Undefined:
                    break;

                default:
                    return false;
            }
            return true;
        }