private void listBoxSubtitles_SelectedIndexChanged(object sender, EventArgs e) { int idx = listBoxSubtitles.SelectedIndex; if (idx < 0) { return; } int pid = _tsParser.SubtitlePacketIds[listBoxTracks.SelectedIndex]; var list = _tsParser.GetDvbSubtitles(pid); var dvbBmp = list[idx].GetActiveImage(); var nDvbBmp = new NikseBitmap(dvbBmp); nDvbBmp.CropTopTransparent(2); nDvbBmp.CropTransparentSidesAndBottom(2, true); dvbBmp.Dispose(); var oldImage = pictureBox1.Image; pictureBox1.Image = nDvbBmp.GetBitmap(); if (oldImage != null) { oldImage.Dispose(); } }
internal void Initialize(Bitmap bitmap, int pixelsIsSpace, bool rightToLeft, NOcrDb nOcrDb, VobSubOcr vobSubOcr, double unItalicFactor) { _bitmap = bitmap; var nbmp = new NikseBitmap(bitmap); nbmp.ReplaceNonWhiteWithTransparent(); bitmap = nbmp.GetBitmap(); _bitmap2 = bitmap; _nocrChars = nOcrDb.OcrCharacters; _matchList = new List <VobSubOcr.CompareMatch>(); _vobSubOcr = vobSubOcr; _unItalicFactor = unItalicFactor; int minLineHeight = 6; _imageList = NikseBitmapImageSplitter.SplitBitmapToLettersNew(nbmp, pixelsIsSpace, rightToLeft, Configuration.Settings.VobSubOcr.TopToBottom, minLineHeight); // _imageList = NikseBitmapImageSplitter.SplitBitmapToLetters(nbmp, pixelsIsSpace, rightToLeft, Configuration.Settings.VobSubOcr.TopToBottom); int index = 0; while (index < _imageList.Count) { ImageSplitterItem item = _imageList[index]; if (item.NikseBitmap == null) { listBoxInspectItems.Items.Add(item.SpecialCharacter); _matchList.Add(null); } else { nbmp = item.NikseBitmap; nbmp.ReplaceNonWhiteWithTransparent(); item.Y += nbmp.CropTopTransparent(0); nbmp.CropTransparentSidesAndBottom(0, true); nbmp.ReplaceTransparentWith(Color.Black); //get nocr matches Nikse.SubtitleEdit.Forms.VobSubOcr.CompareMatch match = vobSubOcr.GetNOcrCompareMatchNew(item, nbmp, nOcrDb, _unItalicFactor, false, false); if (match == null) { listBoxInspectItems.Items.Add("?"); _matchList.Add(null); } else { listBoxInspectItems.Items.Add(match.Text); _matchList.Add(match); } } index++; } }
internal void Initialize(Bitmap bitmap, int pixelsIsSpace, bool rightToLeft, NOcrDb nOcrDb, VobSubOcr vobSubOcr) { _bitmap = bitmap; var nbmp = new NikseBitmap(bitmap); nbmp.ReplaceNonWhiteWithTransparent(); bitmap = nbmp.GetBitmap(); _bitmap2 = bitmap; _nocrChars = nOcrDb.OcrCharacters; _matchList = new List<VobSubOcr.CompareMatch>(); _vobSubOcr = vobSubOcr; const int minLineHeight = 6; _imageList = NikseBitmapImageSplitter.SplitBitmapToLettersNew(nbmp, pixelsIsSpace, rightToLeft, Configuration.Settings.VobSubOcr.TopToBottom, minLineHeight); // _imageList = NikseBitmapImageSplitter.SplitBitmapToLetters(nbmp, pixelsIsSpace, rightToLeft, Configuration.Settings.VobSubOcr.TopToBottom); int index = 0; while (index < _imageList.Count) { ImageSplitterItem item = _imageList[index]; if (item.NikseBitmap == null) { listBoxInspectItems.Items.Add(item.SpecialCharacter); _matchList.Add(null); } else { nbmp = item.NikseBitmap; nbmp.ReplaceNonWhiteWithTransparent(); item.Y += nbmp.CropTopTransparent(0); nbmp.CropTransparentSidesAndBottom(0, true); nbmp.ReplaceTransparentWith(Color.Black); //get nocr matches var match = vobSubOcr.GetNOcrCompareMatchNew(item, nbmp, nOcrDb, false, false); if (match == null) { listBoxInspectItems.Items.Add("?"); _matchList.Add(null); } else { listBoxInspectItems.Items.Add(match.Text); _matchList.Add(match); } } index++; } }
private void RefreshImage() { pictureBox1.Image?.Dispose(); var n = new NikseBitmap(_source); n.CropTopTransparent(9999); if (panelColorToWhite.BackColor != Color.Transparent) { n.ReplaceColor(panelColorToWhite.BackColor.A, panelColorToWhite.BackColor.R, panelColorToWhite.BackColor.G, panelColorToWhite.BackColor.B, 255, 255, 255, 255); } if (panelColorToRemove.BackColor != Color.Transparent) { n.ReplaceColor(panelColorToRemove.BackColor.A, panelColorToRemove.BackColor.R, panelColorToRemove.BackColor.G, panelColorToRemove.BackColor.B, Color.Transparent.A, Color.Transparent.R, Color.Transparent.G, Color.Transparent.B); } if (_isBinaryImageCompare) { n.MakeTwoColor((int)numericUpDownThreshold.Value); } pictureBox1.Image = n.GetBitmap(); }
public BinEditBrightness(Bitmap bitmap) { UiUtil.PreInitialize(this); InitializeComponent(); UiUtil.FixFonts(this); var nikseBitmap = new NikseBitmap(bitmap); nikseBitmap.CropTransparentSidesAndBottom(99999, true); nikseBitmap.CropTopTransparent(2); _bitmap = nikseBitmap.GetBitmap(); trackBarBrightness_Scroll(null, null); Factor = 1.0m; Alignment = ContentAlignment.BottomCenter; Text = LanguageSettings.Current.BinEdit.ChangeBrightnessTitle; labelChangeBrightness.Text = string.Format(LanguageSettings.Current.BinEdit.BrightnessX, trackBarBrightness.Value); buttonOK.Text = LanguageSettings.Current.General.Ok; buttonCancel.Text = LanguageSettings.Current.General.Cancel; UiUtil.FixLargeFonts(this, buttonOK); }
public BinEditAlpha(Bitmap bitmap) { UiUtil.PreInitialize(this); InitializeComponent(); UiUtil.FixFonts(this); var nikseBitmap = new NikseBitmap(bitmap); nikseBitmap.CropTransparentSidesAndBottom(99999, true); nikseBitmap.CropTopTransparent(2); _bitmap = nikseBitmap.GetBitmap(); _backgroundImageDark = Configuration.Settings.General.UseDarkTheme; trackBarAlpha_Scroll(null, null); Factor = 1.0m; Alignment = ContentAlignment.BottomCenter; Text = LanguageSettings.Current.BinEdit.ChangeAlphaTitle; labelChangeAlpha.Text = string.Format(LanguageSettings.Current.BinEdit.AlphaX, trackBarAlpha.Value); buttonOK.Text = LanguageSettings.Current.General.Ok; buttonCancel.Text = LanguageSettings.Current.General.Cancel; UiUtil.FixLargeFonts(this, buttonOK); }
public Bitmap GetSubtitleBitmap(int index) { Bitmap returnBmp = null; Color background; Color pattern; Color emphasis1; Color emphasis2; if (_mp4List != null) { if (index >= 0 && index < _mp4List.Count) { if (checkBoxCustomFourColors.Checked) { GetCustomColors(out background, out pattern, out emphasis1, out emphasis2); returnBmp = _mp4List[index].Picture.GetBitmap(null, background, pattern, emphasis1, emphasis2, true); if (checkBoxAutoTransparentBackground.Checked) returnBmp.MakeTransparent(); } else { returnBmp = _mp4List[index].Picture.GetBitmap(null, Color.Transparent, Color.Black, Color.White, Color.Black, false); if (checkBoxAutoTransparentBackground.Checked) returnBmp.MakeTransparent(); } } } else if (_spList != null) { if (index >= 0 && index < _spList.Count) { if (checkBoxCustomFourColors.Checked) { GetCustomColors(out background, out pattern, out emphasis1, out emphasis2); returnBmp = _spList[index].Picture.GetBitmap(null, background, pattern, emphasis1, emphasis2, true); if (checkBoxAutoTransparentBackground.Checked) returnBmp.MakeTransparent(); } else { returnBmp = _spList[index].Picture.GetBitmap(null, Color.Transparent, Color.Black, Color.White, Color.Black, false); if (checkBoxAutoTransparentBackground.Checked) returnBmp.MakeTransparent(); } } } else if (_bdnXmlSubtitle != null) { if (index >= 0 && index < _bdnXmlSubtitle.Paragraphs.Count) { var fileNames = _bdnXmlSubtitle.Paragraphs[index].Text.SplitToLines(); var bitmaps = new List<Bitmap>(); int maxWidth = 0; int totalHeight = 0; foreach (string fn in fileNames) { string fullFileName = Path.Combine(Path.GetDirectoryName(_bdnFileName), fn); if (!File.Exists(fullFileName)) { // fix AVISubDetector lines int idxOfIEquals = fn.IndexOf("i=", StringComparison.OrdinalIgnoreCase); if (idxOfIEquals >= 0) { int idxOfSpace = fn.IndexOf(' ', idxOfIEquals); if (idxOfSpace > 0) { fullFileName = Path.Combine(Path.GetDirectoryName(_bdnFileName), fn.Remove(0, idxOfSpace).Trim()); } } } if (File.Exists(fullFileName)) { try { var temp = new Bitmap(fullFileName); if (temp.Width > maxWidth) maxWidth = temp.Width; totalHeight += temp.Height; bitmaps.Add(temp); } catch { return null; } } } Bitmap b = null; if (bitmaps.Count > 1) { var merged = new Bitmap(maxWidth, totalHeight + 7 * bitmaps.Count); int y = 0; for (int k = 0; k < bitmaps.Count; k++) { Bitmap part = bitmaps[k]; if (checkBoxAutoTransparentBackground.Checked) part.MakeTransparent(); using (var g = Graphics.FromImage(merged)) g.DrawImage(part, 0, y); y += part.Height + 7; part.Dispose(); } b = merged; } else if (bitmaps.Count == 1) { b = bitmaps[0]; } if (b != null) { if (_isSon && checkBoxCustomFourColors.Checked) { GetCustomColors(out background, out pattern, out emphasis1, out emphasis2); FastBitmap fbmp = new FastBitmap(b); fbmp.LockImage(); for (int x = 0; x < fbmp.Width; x++) { for (int y = 0; y < fbmp.Height; y++) { Color c = fbmp.GetPixel(x, y); if (c.R == Color.Red.R && c.G == Color.Red.G && c.B == Color.Red.B) // normally anti-alias fbmp.SetPixel(x, y, emphasis2); else if (c.R == Color.Blue.R && c.G == Color.Blue.G && c.B == Color.Blue.B) // normally text? fbmp.SetPixel(x, y, pattern); else if (c.R == Color.White.R && c.G == Color.White.G && c.B == Color.White.B) // normally background fbmp.SetPixel(x, y, background); else if (c.R == Color.Black.R && c.G == Color.Black.G && c.B == Color.Black.B) // outline/border fbmp.SetPixel(x, y, emphasis1); else fbmp.SetPixel(x, y, c); } } fbmp.UnlockImage(); } if (checkBoxAutoTransparentBackground.Checked) b.MakeTransparent(); returnBmp = b; } } } else if (_xSubList != null) { if (index >= 0 && index < _xSubList.Count) { if (checkBoxCustomFourColors.Checked) { GetCustomColors(out background, out pattern, out emphasis1, out emphasis2); returnBmp = _xSubList[index].GetImage(background, pattern, emphasis1, emphasis2); } else { returnBmp = _xSubList[index].GetImage(); } } } else if (_dvbSubtitles != null) { if (index >= 0 && index < _dvbSubtitles.Count) { var dvbBmp = _dvbSubtitles[index].GetActiveImage(); var nDvbBmp = new NikseBitmap(dvbBmp); nDvbBmp.CropTopTransparent(2); nDvbBmp.CropTransparentSidesAndBottom(2, true); if (checkBoxTransportStreamGetColorAndSplit.Checked) _dvbSubColor = nDvbBmp.GetBrightestColorWhiteIsTransparent(); if (checkBoxAutoTransparentBackground.Checked) nDvbBmp.MakeBackgroundTransparent((int)numericUpDownAutoTransparentAlphaMax.Value); if (checkBoxTransportStreamGrayscale.Checked) nDvbBmp.GrayScale(); dvbBmp.Dispose(); returnBmp = nDvbBmp.GetBitmap(); } } else if (_dvbPesSubtitles != null) { if (index >= 0 && index < _dvbPesSubtitles.Count) { var dvbBmp = _dvbPesSubtitles[index].GetImageFull(); var nDvbBmp = new NikseBitmap(dvbBmp); nDvbBmp.CropTopTransparent(2); nDvbBmp.CropTransparentSidesAndBottom(2, true); if (checkBoxTransportStreamGetColorAndSplit.Checked) _dvbSubColor = nDvbBmp.GetBrightestColorWhiteIsTransparent(); if (checkBoxAutoTransparentBackground.Checked) nDvbBmp.MakeBackgroundTransparent((int)numericUpDownAutoTransparentAlphaMax.Value); if (checkBoxTransportStreamGrayscale.Checked) nDvbBmp.GrayScale(); dvbBmp.Dispose(); returnBmp = nDvbBmp.GetBitmap(); } } else if (_bluRaySubtitlesOriginal != null) { if (index >= 0 && index < _bluRaySubtitles.Count) { returnBmp = _bluRaySubtitles[index].GetBitmap(); } } else if (index >= 0 && index < _vobSubMergedPackist.Count) { if (checkBoxCustomFourColors.Checked) { GetCustomColors(out background, out pattern, out emphasis1, out emphasis2); returnBmp = _vobSubMergedPackist[index].SubPicture.GetBitmap(null, background, pattern, emphasis1, emphasis2, true); if (checkBoxAutoTransparentBackground.Checked) returnBmp.MakeTransparent(); } else { returnBmp = _vobSubMergedPackist[index].SubPicture.GetBitmap(_palette, Color.Transparent, Color.Black, Color.White, Color.Black, false); if (checkBoxAutoTransparentBackground.Checked) returnBmp.MakeTransparent(); } } if (returnBmp == null) return null; if ((_binaryOcrDb == null && _nOcrDb == null) || _fromMenuItem) return returnBmp; var n = new NikseBitmap(returnBmp); n.MakeTwoColor(280); returnBmp.Dispose(); return n.GetBitmap(); }
internal static void WriteTrack(string fileName, string outputFolder, bool overwrite, int count, StreamWriter stdOutWriter, CommandLineConverter.BatchConvertProgress progressCallback, Point?resolution, ProgramMapTableParser programMapTableParser, int pid, TransportStreamParser tsParser) { var overrideScreenSize = Configuration.Settings.Tools.BatchConvertTsOverrideScreenSize && Configuration.Settings.Tools.BatchConvertTsScreenHeight > 0 && Configuration.Settings.Tools.BatchConvertTsScreenWidth > 0 || resolution.HasValue; using (var form = new ExportPngXml()) { form.Initialize(new Subtitle(), new SubRip(), BatchConvert.BluRaySubtitle, fileName, null, fileName); var language = GetFileNameEnding(programMapTableParser, pid); var outputFileName = CommandLineConverter.FormatOutputFileNameForBatchConvert(Utilities.GetPathAndFileNameWithoutExtension(fileName) + language + Path.GetExtension(fileName), ".sup", outputFolder, overwrite); stdOutWriter?.Write($"{count}: {Path.GetFileName(fileName)} -> PID {pid} to {outputFileName}..."); var sub = tsParser.GetDvbSubtitles(pid); progressCallback?.Invoke($"Save PID {pid}"); var subtitleScreenSize = GetSubtitleScreenSize(sub, overrideScreenSize, resolution); using (var binarySubtitleFile = new FileStream(outputFileName, FileMode.Create)) { for (int index = 0; index < sub.Count; index++) { var p = sub[index]; var pos = p.GetPosition(); var bmp = sub[index].GetBitmap(); var tsWidth = bmp.Width; var tsHeight = bmp.Height; var nBmp = new NikseBitmap(bmp); pos.Top += nBmp.CropTopTransparent(0); pos.Left += nBmp.CropSidesAndBottom(0, Color.FromArgb(0, 0, 0, 0), true); bmp.Dispose(); bmp = nBmp.GetBitmap(); var mp = form.MakeMakeBitmapParameter(index, subtitleScreenSize.X, subtitleScreenSize.Y); if (overrideScreenSize) { var widthFactor = (double)subtitleScreenSize.X / tsWidth; var heightFactor = (double)subtitleScreenSize.Y / tsHeight; var resizeBmp = ResizeBitmap(bmp, (int)Math.Round(bmp.Width * widthFactor), (int)Math.Round(bmp.Height * heightFactor)); bmp.Dispose(); bmp = resizeBmp; pos.Left = (int)Math.Round(pos.Left * widthFactor); pos.Top = (int)Math.Round(pos.Top * heightFactor); progressCallback?.Invoke($"Save PID {pid}: {(index + 1) * 100 / sub.Count}%"); } mp.Bitmap = bmp; mp.P = new Paragraph(string.Empty, p.StartMilliseconds, p.EndMilliseconds); mp.ScreenWidth = subtitleScreenSize.X; mp.ScreenHeight = subtitleScreenSize.Y; if (Configuration.Settings.Tools.BatchConvertTsOverrideXPosition || Configuration.Settings.Tools.BatchConvertTsOverrideYPosition) { var overrideMarginX = (int)Math.Round(Configuration.Settings.Tools.BatchConvertTsOverrideHMargin * subtitleScreenSize.X / 100.0); var overrideMarginY = (int)Math.Round(Configuration.Settings.Tools.BatchConvertTsOverrideBottomMargin * subtitleScreenSize.Y / 100.0); if (Configuration.Settings.Tools.BatchConvertTsOverrideXPosition && Configuration.Settings.Tools.BatchConvertTsOverrideYPosition) { var x = (int)Math.Round(subtitleScreenSize.X / 2.0 - mp.Bitmap.Width / 2.0); if (Configuration.Settings.Tools.BatchConvertTsOverrideHAlign.Equals("left", StringComparison.OrdinalIgnoreCase)) { x = overrideMarginX; } else if (Configuration.Settings.Tools.BatchConvertTsOverrideHAlign.Equals("right", StringComparison.OrdinalIgnoreCase)) { x = subtitleScreenSize.X - overrideMarginX - mp.Bitmap.Width; } var y = subtitleScreenSize.Y - overrideMarginY - mp.Bitmap.Height; mp.OverridePosition = new Point(x, y); } else if (Configuration.Settings.Tools.BatchConvertTsOverrideXPosition) { var x = (int)Math.Round(subtitleScreenSize.X / 2.0 - mp.Bitmap.Width / 2.0); if (Configuration.Settings.Tools.BatchConvertTsOverrideHAlign.Equals("left", StringComparison.OrdinalIgnoreCase)) { x = overrideMarginX; } else if (Configuration.Settings.Tools.BatchConvertTsOverrideHAlign.Equals("right", StringComparison.OrdinalIgnoreCase)) { x = subtitleScreenSize.X - overrideMarginX - mp.Bitmap.Width; } mp.OverridePosition = new Point(x, pos.Top); } else { var y = subtitleScreenSize.Y - overrideMarginY - mp.Bitmap.Height; mp.OverridePosition = new Point(pos.Left, y); } } else { mp.OverridePosition = new Point(pos.Left, pos.Top); // use original position (can be scaled) } ExportPngXml.MakeBluRaySupImage(mp); binarySubtitleFile.Write(mp.Buffer, 0, mp.Buffer.Length); mp.Bitmap?.Dispose(); mp.Bitmap = null; } } } stdOutWriter?.WriteLine(" done."); }
internal static void WriteTrack(string fileName, string outputFolder, bool overwrite, StreamWriter stdOutWriter, CommandLineConverter.BatchConvertProgress progressCallback, Point?resolution, ProgramMapTableParser programMapTableParser, int pid, TransportStreamParser tsParser) { var overrideScreenSize = Configuration.Settings.Tools.BatchConvertTsOverrideScreenSize && Configuration.Settings.Tools.BatchConvertTsScreenHeight > 0 && Configuration.Settings.Tools.BatchConvertTsScreenWidth > 0 || resolution.HasValue; using (var form = new ExportPngXml()) { var language = TsToBluRaySup.GetFileNameEnding(programMapTableParser, pid); var nameNoExt = Utilities.GetFileNameWithoutExtension(fileName) + "." + language; var folder = Path.Combine(outputFolder, nameNoExt); if (!Directory.Exists(folder)) { Directory.CreateDirectory(folder); } var outputFileName = CommandLineConverter.FormatOutputFileNameForBatchConvert(nameNoExt + Path.GetExtension(fileName), ".xml", folder, overwrite); stdOutWriter?.WriteLine($"Saving PID {pid} to {outputFileName}..."); progressCallback?.Invoke($"Save PID {pid}"); var sub = tsParser.GetDvbSubtitles(pid); var subtitle = new Subtitle(); foreach (var p in sub) { subtitle.Paragraphs.Add(new Paragraph(string.Empty, p.StartMilliseconds, p.EndMilliseconds)); } var res = TsToBluRaySup.GetSubtitleScreenSize(sub, overrideScreenSize, resolution); var videoInfo = new VideoInfo { Success = true, Width = res.X, Height = res.Y }; form.Initialize(subtitle, new SubRip(), BatchConvert.BdnXmlSubtitle, fileName, videoInfo, fileName); var sb = new StringBuilder(); var imagesSavedCount = 0; for (int index = 0; index < sub.Count; index++) { var p = sub[index]; var pos = p.GetPosition(); var bmp = sub[index].GetBitmap(); var tsWidth = bmp.Width; var tsHeight = bmp.Height; var nBmp = new NikseBitmap(bmp); pos.Top += nBmp.CropTopTransparent(0); pos.Left += nBmp.CropSidesAndBottom(0, Color.FromArgb(0, 0, 0, 0), true); bmp.Dispose(); bmp = nBmp.GetBitmap(); var mp = form.MakeMakeBitmapParameter(index, videoInfo.Width, videoInfo.Height); if (overrideScreenSize) { var widthFactor = (double)videoInfo.Width / tsWidth; var heightFactor = (double)videoInfo.Height / tsHeight; var resizeBmp = ResizeBitmap(bmp, (int)Math.Round(bmp.Width * widthFactor), (int)Math.Round(bmp.Height * heightFactor)); bmp.Dispose(); bmp = resizeBmp; pos.Left = (int)Math.Round(pos.Left * widthFactor); pos.Top = (int)Math.Round(pos.Top * heightFactor); progressCallback?.Invoke($"Save PID {pid}: {(index + 1) * 100 / sub.Count}%"); } mp.Bitmap = bmp; mp.P = new Paragraph(string.Empty, p.StartMilliseconds, p.EndMilliseconds); mp.ScreenWidth = videoInfo.Width; mp.ScreenHeight = videoInfo.Height; int bottomMarginInPixels; if (Configuration.Settings.Tools.BatchConvertTsOverrideXPosition || Configuration.Settings.Tools.BatchConvertTsOverrideYPosition) { if (Configuration.Settings.Tools.BatchConvertTsOverrideXPosition && Configuration.Settings.Tools.BatchConvertTsOverrideYPosition) { var x = (int)Math.Round(videoInfo.Width / 2.0 - mp.Bitmap.Width / 2.0); if (Configuration.Settings.Tools.BatchConvertTsOverrideHAlign.Equals("left", StringComparison.OrdinalIgnoreCase)) { x = Configuration.Settings.Tools.BatchConvertTsOverrideHMargin; } else if (Configuration.Settings.Tools.BatchConvertTsOverrideHAlign.Equals("right", StringComparison.OrdinalIgnoreCase)) { x = videoInfo.Width - Configuration.Settings.Tools.BatchConvertTsOverrideHMargin - mp.Bitmap.Width; } var y = videoInfo.Height - Configuration.Settings.Tools.BatchConvertTsOverrideBottomMargin - mp.Bitmap.Height; mp.OverridePosition = new Point(x, y); } else if (Configuration.Settings.Tools.BatchConvertTsOverrideXPosition) { var x = (int)Math.Round(videoInfo.Width / 2.0 - mp.Bitmap.Width / 2.0); if (Configuration.Settings.Tools.BatchConvertTsOverrideHAlign.Equals("left", StringComparison.OrdinalIgnoreCase)) { x = Configuration.Settings.Tools.BatchConvertTsOverrideHMargin; } else if (Configuration.Settings.Tools.BatchConvertTsOverrideHAlign.Equals("right", StringComparison.OrdinalIgnoreCase)) { x = videoInfo.Width - Configuration.Settings.Tools.BatchConvertTsOverrideHMargin - mp.Bitmap.Width; } mp.OverridePosition = new Point(x, pos.Top); } else { var y = videoInfo.Height - Configuration.Settings.Tools.BatchConvertTsOverrideBottomMargin - mp.Bitmap.Height; mp.OverridePosition = new Point(pos.Left, y); } bottomMarginInPixels = Configuration.Settings.Tools.BatchConvertTsScreenHeight - pos.Top - mp.Bitmap.Height; } else { mp.OverridePosition = new Point(pos.Left, pos.Top); // use original position bottomMarginInPixels = Configuration.Settings.Tools.BatchConvertTsScreenHeight - pos.Top - mp.Bitmap.Height; } imagesSavedCount = form.WriteBdnXmlParagraph(videoInfo.Width, sb, bottomMarginInPixels, videoInfo.Height, imagesSavedCount, mp, index, Path.GetDirectoryName(outputFileName)); } form.WriteBdnXmlFile(imagesSavedCount, sb, outputFileName); } }
public static bool ConvertFromTsToBluRaySup(string fileName, string outputFolder, bool overwrite, StreamWriter stdOutWriter, CommandLineConverter.BatchConvertProgress progressCallback) { var tsParser = new TransportStreamParser(); tsParser.Parse(fileName, (position, total) => { var percent = (int)Math.Round(position * 100.0 / total); stdOutWriter?.Write("\rParsing transport stream: {0}%", percent); progressCallback?.Invoke($"{percent}%"); }); stdOutWriter?.Write("\r".PadRight(32, ' ')); stdOutWriter?.Write("\r"); var videoInfo = UiUtil.GetVideoInfo(fileName); int width = 720; int height = 576; if (videoInfo.Success && videoInfo.Width > 0 && videoInfo.Height > 0) { width = videoInfo.Width; height = videoInfo.Height; } var overrideScreenSize = Configuration.Settings.Tools.BatchConvertTsOverrideScreenSize && Configuration.Settings.Tools.BatchConvertTsScreenWidth > 0 && Configuration.Settings.Tools.BatchConvertTsScreenHeight > 0; if (overrideScreenSize) { width = Configuration.Settings.Tools.BatchConvertTsScreenWidth; height = Configuration.Settings.Tools.BatchConvertTsScreenHeight; } using (var form = new ExportPngXml()) { if (tsParser.SubtitlePacketIds.Count == 0) { stdOutWriter?.WriteLine($"No subtitles found"); progressCallback?.Invoke($"No subtitles found"); return(false); } form.Initialize(new Subtitle(), new SubRip(), BatchConvert.BluRaySubtitle, fileName, videoInfo, fileName); foreach (int pid in tsParser.SubtitlePacketIds) { var outputFileName = CommandLineConverter.FormatOutputFileNameForBatchConvert(Utilities.GetPathAndFileNameWithoutExtension(fileName) + "-" + pid + Path.GetExtension(fileName), ".sup", outputFolder, overwrite); stdOutWriter?.WriteLine($"Saving PID {pid} to {outputFileName}..."); var sub = tsParser.GetDvbSubtitles(pid); progressCallback?.Invoke($"Save PID {pid}"); using (var binarySubtitleFile = new FileStream(outputFileName, FileMode.Create)) { for (int index = 0; index < sub.Count; index++) { var p = sub[index]; var pos = p.GetPosition(); var bmp = sub[index].GetBitmap(); if (!overrideScreenSize) { width = bmp.Width; height = bmp.Height; videoInfo.Width = bmp.Width; videoInfo.Height = bmp.Height; } var tsWidth = bmp.Width; var tsHeight = bmp.Height; var nbmp = new NikseBitmap(bmp); pos.Top += nbmp.CropTopTransparent(0); pos.Left += nbmp.CropSidesAndBottom(0, Color.FromArgb(0, 0, 0, 0), true); bmp.Dispose(); bmp = nbmp.GetBitmap(); var mp = form.MakeMakeBitmapParameter(index, width, height); if (overrideScreenSize) { var widthFactor = (double)width / tsWidth; var heightFactor = (double)height / tsHeight; var resizeBmp = ResizeBitmap(bmp, (int)Math.Round(bmp.Width * widthFactor), (int)Math.Round(bmp.Height * heightFactor)); bmp.Dispose(); bmp = resizeBmp; pos.Left = (int)Math.Round(pos.Left * widthFactor); pos.Top = (int)Math.Round(pos.Top * heightFactor); progressCallback?.Invoke($"Save PID {pid}: {(index + 1) * 100 / sub.Count}%"); } mp.Bitmap = bmp; mp.P = new Paragraph(string.Empty, p.StartMilliseconds, p.EndMilliseconds); mp.ScreenWidth = width; mp.ScreenHeight = height; if (Configuration.Settings.Tools.BatchConvertTsOverrideXPosition || Configuration.Settings.Tools.BatchConvertTsOverrideYPosition) { var overrideMarginX = (int)Math.Round(Configuration.Settings.Tools.BatchConvertTsOverrideHMargin * width / 100.0); var overrideMarginY = (int)Math.Round(Configuration.Settings.Tools.BatchConvertTsOverrideBottomMargin * width / 100.0); if (Configuration.Settings.Tools.BatchConvertTsOverrideXPosition && Configuration.Settings.Tools.BatchConvertTsOverrideYPosition) { var x = (int)Math.Round((width / 2.0) - mp.Bitmap.Width / 2.0); if (Configuration.Settings.Tools.BatchConvertTsOverrideHAlign.Equals("left", StringComparison.OrdinalIgnoreCase)) { x = overrideMarginX; } else if (Configuration.Settings.Tools.BatchConvertTsOverrideHAlign.Equals("right", StringComparison.OrdinalIgnoreCase)) { x = width - overrideMarginX - mp.Bitmap.Width; } var y = height - overrideMarginY - mp.Bitmap.Height; mp.OverridePosition = new Point(x, y); } else if (Configuration.Settings.Tools.BatchConvertTsOverrideXPosition) { var x = (int)Math.Round((width / 2.0) - mp.Bitmap.Width / 2.0); if (Configuration.Settings.Tools.BatchConvertTsOverrideHAlign.Equals("left", StringComparison.OrdinalIgnoreCase)) { x = overrideMarginX; } else if (Configuration.Settings.Tools.BatchConvertTsOverrideHAlign.Equals("right", StringComparison.OrdinalIgnoreCase)) { x = width - overrideMarginX - mp.Bitmap.Width; } mp.OverridePosition = new Point(x, pos.Top); } else { var y = height - overrideMarginY - mp.Bitmap.Height; mp.OverridePosition = new Point(pos.Left, y); } } else { mp.OverridePosition = new Point(pos.Left, pos.Top); // use original position (can be scaled) } ExportPngXml.MakeBluRaySupImage(mp); binarySubtitleFile.Write(mp.Buffer, 0, mp.Buffer.Length); if (mp.Bitmap != null) { mp.Bitmap.Dispose(); mp.Bitmap = null; } } } } } return(true); }
private void listBoxSubtitles_SelectedIndexChanged(object sender, EventArgs e) { int idx = listBoxSubtitles.SelectedIndex; if (idx < 0) return; int pid = _tsParser.SubtitlePacketIds[listBoxTracks.SelectedIndex]; var list = _tsParser.GetDvbSubtitles(pid); var dvbBmp = list[idx].GetActiveImage(); var nDvbBmp = new NikseBitmap(dvbBmp); nDvbBmp.CropTopTransparent(2); nDvbBmp.CropTransparentSidesAndBottom(2, true); dvbBmp.Dispose(); var oldImage = pictureBox1.Image; pictureBox1.Image = nDvbBmp.GetBitmap(); if (oldImage != null) oldImage.Dispose(); }
public static bool ConvertFromTsToBdnXml(string fileName, string outputFolder, bool overwrite, StreamWriter stdOutWriter, CommandLineConverter.BatchConvertProgress progressCallback) { var tsParser = new TransportStreamParser(); tsParser.Parse(fileName, (position, total) => { var percent = (int)Math.Round(position * 100.0 / total); stdOutWriter?.Write("\rParsing transport stream: {0}%", percent); progressCallback?.Invoke($"{percent}%"); }); stdOutWriter?.Write("\r".PadRight(32, ' ')); stdOutWriter?.Write("\r"); var videoInfo = UiUtil.GetVideoInfo(fileName); int width = 1920; int height = 1080; if (videoInfo.Success && videoInfo.Width > 0 && videoInfo.Height > 0) { width = videoInfo.Width; height = videoInfo.Height; } if (Configuration.Settings.Tools.BatchConvertTsOverrideScreenSize && Configuration.Settings.Tools.BatchConvertTsScreenWidth > 0 && Configuration.Settings.Tools.BatchConvertTsScreenHeight > 0) { width = Configuration.Settings.Tools.BatchConvertTsScreenWidth; height = Configuration.Settings.Tools.BatchConvertTsScreenHeight; } using (var form = new ExportPngXml()) { if (tsParser.SubtitlePacketIds.Count == 0) { stdOutWriter?.WriteLine($"No subtitles found"); progressCallback?.Invoke($"No subtitles found"); return(false); } foreach (int pid in tsParser.SubtitlePacketIds) { var outputFileName = CommandLineConverter.FormatOutputFileNameForBatchConvert(Utilities.GetPathAndFileNameWithoutExtension(fileName) + "-" + pid + Path.GetExtension(fileName), ".xml", outputFolder, overwrite); stdOutWriter?.WriteLine($"Saving PID {pid} to {outputFileName}..."); progressCallback?.Invoke($"Save PID {pid}"); var sub = tsParser.GetDvbSubtitles(pid); var subtitle = new Subtitle(); foreach (var p in sub) { subtitle.Paragraphs.Add(new Paragraph(string.Empty, p.StartMilliseconds, p.EndMilliseconds)); } form.Initialize(subtitle, new SubRip(), BatchConvert.BdnXmlSubtitle, fileName, videoInfo, fileName); var sb = new StringBuilder(); var imagesSavedCount = 0; for (int index = 0; index < sub.Count; index++) { var p = sub[index]; var pos = p.GetPosition(); var bmp = sub[index].GetBitmap(); var nbmp = new NikseBitmap(bmp); pos.Top += nbmp.CropTopTransparent(0); pos.Left += nbmp.CropSidesAndBottom(0, Color.FromArgb(0, 0, 0, 0), true); bmp.Dispose(); bmp = nbmp.GetBitmap(); var mp = form.MakeMakeBitmapParameter(index, width, height); mp.Bitmap = bmp; mp.P = new Paragraph(string.Empty, p.StartMilliseconds, p.EndMilliseconds); mp.ScreenWidth = width; mp.ScreenHeight = height; int bottomMarginInPixels; if (Configuration.Settings.Tools.BatchConvertTsOverridePosition || Configuration.Settings.Tools.BatchConvertTsOverrideScreenSize && Configuration.Settings.Tools.BatchConvertTsScreenWidth > 0 && Configuration.Settings.Tools.BatchConvertTsScreenHeight > 0) { mp.BottomMargin = Configuration.Settings.Tools.BatchConvertTsOverrideBottomMargin; bottomMarginInPixels = Configuration.Settings.Tools.BatchConvertTsOverrideBottomMargin; mp.Alignment = ContentAlignment.BottomCenter; } else { mp.OverridePosition = new Point(pos.Left, pos.Top); // use original position bottomMarginInPixels = Configuration.Settings.Tools.BatchConvertTsScreenHeight - pos.Top - mp.Bitmap.Height; } imagesSavedCount = form.WriteBdnXmlParagraph(width, sb, bottomMarginInPixels, height, imagesSavedCount, mp, index, Path.GetDirectoryName(outputFileName)); if (mp.Bitmap != null) { mp.Bitmap.Dispose(); mp.Bitmap = null; } } form.WriteBdnXmlFile(imagesSavedCount, sb, outputFileName); } } return(true); }