Пример #1
0
        private static bool QualifiesForMerge(IReadOnlyList <DeleteIndex> arr, IReadOnlyList <PcsData> pcsList, int mergeCount)
        {
            if (Configuration.Settings.SubtitleSettings.BluRaySupForceMergeAll)
            {
                return(false);
            }

            if (mergeCount < 3)
            {
                return(false);
            }

            if (arr.Count != 2)
            {
                return(true);
            }

            var i1   = pcsList[arr[0].Index];
            var i2   = pcsList[arr[1].Index];
            var dur1 = i1.EndTimeCode.TotalMilliseconds - i1.StartTimeCode.TotalMilliseconds;
            var dur2 = i2.EndTimeCode.TotalMilliseconds - i2.StartTimeCode.TotalMilliseconds;

            if (dur1 < 400 || dur2 < 400)
            {
                return(true);
            }

            if (i1.PaletteInfos.Count > 2 || i2.PaletteInfos.Count > 2)
            {
                return(true);
            }

            using (var b1 = i1.GetBitmap())
            {
                var n1     = new NikseBitmap(b1);
                var height = n1.GetNonTransparentHeight();
                var width  = n1.GetNonTransparentWidth();
                if (height > 110 || width > 300)
                {
                    return(true);
                }

                using (var b2 = i2.GetBitmap())
                {
                    var n2       = new NikseBitmap(b2);
                    var areEqual = n1.IsEqualTo(n2);
                    return(areEqual);
                }
            }
        }
Пример #2
0
        public List <NikseBitmap> MakeImageList(CdgGraphics cdgGraphics, Subtitle subtitle, CdgToImageSubtitleCallback callback)
        {
            subtitle.Paragraphs.Clear();
            NikseBitmap lastNBmp     = null;
            int         count        = 0;
            var         imageList    = new List <NikseBitmap>();
            Paragraph   p            = null;
            int         packetNumber = 0;
            var         max          = cdgGraphics.NumberOfPackets;

            while (packetNumber < max)
            {
                using (var bmp = cdgGraphics.ToBitmap(packetNumber))
                {
                    var nBmp   = new NikseBitmap(bmp);
                    var timeMs = packetNumber * CdgGraphics.TimeMsFactor;
                    if (lastNBmp == null)
                    {
                        if (nBmp.Width > 0)
                        {
                            lastNBmp = nBmp;
                            p        = new Paragraph(string.Empty, timeMs, timeMs);
                        }
                    }
                    else
                    {
                        if (!nBmp.IsEqualTo(lastNBmp))
                        {
                            if (lastNBmp.Width > 0)
                            {
                                p.EndTime.TotalMilliseconds = timeMs;
                                subtitle.Paragraphs.Add(p);
                                imageList.Add(lastNBmp);
                            }

                            if (nBmp.Width > 0)
                            {
                                p = new Paragraph(string.Empty, timeMs, timeMs);
                            }
                        }
                        else
                        {
                            p.EndTime.TotalMilliseconds = timeMs;
                        }
                        lastNBmp = nBmp;
                    }
                }
                count++;
                packetNumber += SkipPacketCount;
                callback?.Invoke(count, imageList.Count);
            }

            subtitle.Renumber();

            new FixOverlappingDisplayTimes().Fix(subtitle, new EmptyFixCallback());

            // fix small gaps
            for (int i = 0; i < subtitle.Paragraphs.Count - 1; i++)
            {
                var current = subtitle.Paragraphs[i];
                var next    = subtitle.Paragraphs[i + 1];
                if (!next.StartTime.IsMaxTime && !current.EndTime.IsMaxTime)
                {
                    var gap = next.StartTime.TotalMilliseconds - current.EndTime.TotalMilliseconds;
                    if (gap < MergeGapSmallerThanXMilliseconds)
                    {
                        current.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - SmallGapMilliseconds;
                    }
                }
            }

            return(imageList);
        }
Пример #3
0
 private bool IsImagesTheSame(NikseBitmap a, NikseBitmap b)
 {
     return(a.IsEqualTo(b));
 }