AVIFは「AV1 Image File Format」の略です。圧縮率が高い、透過処理ができる、可逆圧縮と非可逆圧縮を選べるという特長があり、Windows、Mac、Linux、Androidで使用できるソフトウェアと互換性があります。
AVIF形式のファイルをダウンロードした場合、これをどうやれば開くことができるのでしょうか? Windowsに標準搭載されているPaintソフトでは開くことができません。右クリック ⇒ アプリケーションで開く ⇒ Chromeなどを選択で開くことができます。
Contents
Selenium.WebDriverで変換する
これをPNG形式に変換するにはどうすればよいでしょうか? ブラウザを使えば開くことができるのでSeleniumを使ってスクリーンショットを取る方法があります。今回はこの方法でavif形式のファイルをPNG形式のファイルに変換します。
Selenium.WebDriver.ChromeDriverの追加
[NuGetパッケージの管理]メニューを選択して[Selenium.WebDriver]と[Selenium.WebDriver.ChromeDriver]を追加します。このとき自分のPCにはGoogle Chromeがインストールされてなければなりません。またGoogle ChromeのバージョンとChromeDriverのバージョンが同じでなければなりません。
変換したいファイルのパスを取得する
以下のコードはファイルがドラッグアンドドロップされたときにファイルの拡張子が.avifであるものを集めて自作メソッドのConvertAvifFilesに渡しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
using System; using System.Collections.Generic; using System.IO; using System.Windows.Forms; using OpenQA.Selenium; using OpenQA.Selenium.Chrome; public partial class Form1 : Form { public Form1() { InitializeComponent(); DragOver += Form1_DragOver; DragDrop += Form1_DragDrop; } private void Form1_DragOver(object sender, DragEventArgs e) { // ファイル以外のものがドラッグされている場合はなにもしない if (e.Data.GetDataPresent(DataFormats.FileDrop)) e.Effect = DragDropEffects.Copy; else e.Effect = DragDropEffects.None; } private void Form1_DragDrop(object sender, DragEventArgs e) { // ファイルがドロップされたら・・・ if (e.Data.GetDataPresent(DataFormats.FileDrop)) { string[] dropedFiles = (string[])e.Data.GetData(DataFormats.FileDrop); List<string> avifFiles = new List<string>(); string folderPath = ""; foreach (string file in dropedFiles) { // 拡張子を調べ.avifだけavifFilesに格納する // folderPathにはドロップされたファイルがどのフォルダのものかを格納する System.IO.FileInfo info = new FileInfo(file); if (info.Extension == ".avif") { avifFiles.Add(file); if (folderPath == "") folderPath = info.DirectoryName; } } if (avifFiles.Count > 0) ConvertAvifFiles(avifFiles); } } } |
Seleniumでファイルのスクリーンショットを取って保存する
Chromeに読ませるのでファイルのパスをfile:///形式に変換します。そのあとdriver.Navigate().GoToUrlメソッドで表示させてスクリーンショットを取ります。拡張子を変更したファイルパスを生成してこれでスクリーンショットをファイルとして保存します。
–headlessを指定することでブラウザそのものを表示させなくすることができます。またHideCommandPromptWindow = trueとすることで動作時に表示されるコンソールウィンドウも非表示にできます。これだと処理がおこなわれているのかわからなくなるので、処理が完了したときはメッセージボックスを表示させています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
public partial class Form1 : Form { void ConvertAvifFiles(List<string> filePaths) { ChromeOptions options = new ChromeOptions(); options.AddArgument("--headless"); var driverService = ChromeDriverService.CreateDefaultService(Application.StartupPath); driverService.HideCommandPromptWindow = true; IWebDriver driver = new ChromeDriver(driverService, options); foreach (var avif in filePaths) { string url = "file:///" + avif.Replace("\\", "/"); driver.Navigate().GoToUrl(url); Screenshot shot = ((ITakesScreenshot)driver).GetScreenshot(); int index = avif.LastIndexOf("."); if (index >= 0) { string fileName = avif.Substring(0, index) + ".png"; shot.SaveAsFile(fileName); } } driver.Quit(); driver.Dispose(); MessageBox.Show("完了!"); } } |