Windows 8.1 では、アプリ内ファイル管理のサポートが強化され、ライブラリを利用してユーザー コンテンツを操作する新しい方法が追加されています。また、アプリのユニークなコンテンツを Windows インデックスにプッシュ通知で送ることができます。言い換えると、アプリでユーザー コンテンツに簡単にアクセスできることに加え、アプリ自体のコンテンツを他のアプリから見つけやすくすることができます。
- ユーザー ライブラリのアプリ内管理
- 親ファイルまたはフォルダーの取得
- IsEqual によるファイルの比較
- 新しい KnownFolders プロパティ
- エラー処理要件のないファイル取得
- 開く (プログラムから開く) シナリオで表示するファイルのビュー
- Windows インデックスへのアプリ コンテンツの追加
- Microsoft OneDrive
- DDS 画像ファイルのサポート
新しいアプリ表示モードをサポートするように更新されたファイル ピッカー
[ファイル ピッカーのサンプルを今すぐ入手する]
Windows 8.1 では、ファイル ピッカーは分割画面と全画面表示で実行されているアプリで呼び出すことができます。これにより、ユーザーは目的の方法で作業やマルチタスクを実行できます。たとえば、ユーザーが 1 つのウィンドウで Skype の会話画面を開き、別のウィンドウでメール アプリを開いている場合は、メール アプリでファイル ピッカーを開き、アプリケーションを全画面表示にしなくても添付ファイルを含めることができます。ファイル ピッカーの使用について詳しくは、「クイック スタート: ファイル ピッカーによるファイルへのアクセス」をご覧ください。
ユーザー ライブラリのアプリ内管理
[ライブラリ管理のサンプルを今すぐ入手する]
Windows 8.1 には、ユーザーがアプリから個人ライブラリ内のフォルダー (音楽フォルダーやビデオ フォルダーなど) を管理できる StorageLibrary クラスが導入されています。これは、ユーザーがさらに多くの画像、音楽、またはビデオが含まれているフォルダーを追加してコレクションを拡大することが多い、メディア ギャラリー アプリで特に便利です。
これを可能にしたのは、ユーザーがライブラリにフォルダーを追加できるようにする StorageLibrary と呼ばれるメソッドを使って呼び出す、特別なファイル ピッカーです。ユーザーは、アプリを終了し、デスクトップに移動してメディア コレクションを拡大する必要がなくなりました。
親ファイルまたはフォルダーの取得
[ファイル アクセスのサンプルを今すぐ入手する]
Windows 8 の Storage API では、ストレージの項目の親フォルダーを直接取得するメソッドは定義されないため、独自のカスタム ロジックを記述する必要がありました。Windows 8.1 では、GetParentAsync メソッドを使ってファイルまたはフォルダーの親 StorageFolder を取得できます。
重要 GetParentAsync メソッドが成功するためには、ライブラリ機能を宣言するか、後でアクセスする一覧で上位レベルのフォルダーを永続化して、その親にアクセスできる必要があります。 また、親にアクセスできない場合、このメソッドは例外を発生させるのではなく null を返します。
IsEqual によるファイルの比較
[ファイル アクセスのサンプルを今すぐ入手する]
Windows 8 の Storage API では、ストレージの項目を直接比較して、同じ項目を表しているかどうか判断するためのメソッドは定義されませんでした。開発者はパスを比較することでこの問題に対処しましたが、それでもパスの値がない項目が発生しました。Windows 8.1 では、IsEqual メソッドを使って、2 つのストレージの項目が同じファイルを表すかどうかを判断できます。
次の例では、新しいメソッドを使って 2 つのストレージ ファイルを比較し、同じかどうか確認する方法を示しています。
function openNewFile() {
var picker = new Windows.Storage.Pickers.FileOpenPicker;
picker.fileTypeFilter.replaceAll(["*"]);
picker.pickSingleFileAsync().then(function (file) {
var alreadyOpenedFile = null;
_openFiles.some(function (openFile) {
if (file.IsEqual(openFile.file)) {
alreadyOpenedFile = openFile;
return true;
}
return false;
});
if (alreadyOpenedFile != null) {
alreadyOpenedFile.window.activate();
} else {
createNewFileViewerWindow(file);
}
});
}
新しい KnownFolders プロパティ
Windows 8.1 では KnownFolders に 2 つの新しいプロパティ (CameraRoll と Playlists) が追加されており、これらのフォルダにあるファイルにアクセスできるようになりました。
KnownFolders.CameraRoll プロパティを使うと、従来からの Windows Phone 8 プロパティのように、デバイス カメラで撮影された画像にアクセスできます。また、KnownFolders.Playlists プロパティを使うと、ユーザーの再生リストにアクセスできます。
エラー処理要件のないファイル取得
[ファイル アクセスのサンプルを今すぐ入手する]
Windows 8.1 には、アプリ コードにエラー キャッチ ロジックを追加することなく、アプリが名前によるファイルまたはフォルダーの取得を試みることができるようにする StorageFolder.TryGetItemAsync メソッドが導入されています。ファイルやフォルダーが見つからない場合、TryGetItemAsync は null を返し、例外をスローしません。このメソッドは null を返すので、これを使って、指定されたファイルまたはフォルダーが存在するかどうかを判断することもできます。
開く (プログラムから開く) シナリオで表示するファイルのビュー
Windows 8.1 では、NeighboringFilesQuery プロパティを使って、アプリがアクィブ化されたファイルに近いファイルへのナビゲーションを有効にできます。
Windows 8 では、特定のファイルに関連付けられた、コンテンツを開く既定のアプリは、呼び出されたファイルのみを表すオブジェクトを取得します。 これは、隣接するファイルに移動することをユーザーが想定しているメディア ギャラリー アプリでは問題となる可能性があります。Windows 8.1 では、既定のアプリは、呼び出されたファイルの選択元のコレクションである周囲のビューで、ファイルのコレクションを取得できます。
アプリで対応する種類の項目を取得するには、特定のライブラリ機能を宣言する必要があります。 たとえば、NeighboringFilesQuery で画像を取得するには、アプリで画像ライブラリ機能を宣言する必要があります。
次の例は、アプリをアクティブ化したファイルに隣接するファイルのコレクションを取得する方法を示しています。
function activated(sender, e) {
if (e.detail.kind === Windows.ApplicationModel.Activation.ActivationKind.file && e.files.size > 0) {
var invokedFile = e.detail.files[0];
var neighboringFiles = e.detail.neighboringFilesQuery;
if (neighboringFiles) {
result.neighboringFiles.findStartIndexAsync(e.detail.files[0]).done(function (index) {
var invokedFileElement = document.getElementById("invokedFile");
invokedFileElement.textContent = "Invoked item: " + invokedFile.name + ", at index " + index + " in view file enumeration.";
var prevFileslist = document.getElementById("prevFilesList");
result.neighboringFiles.getFilesAsync(0, index).done(function (fileList) {
fileList.forEach(function (file) {
// Create an entry in the list for the file.
var fileItemElement = document.createElement("li");
fileItemElement.textContent = file.name;
prevFileslist.appendChild(listItemElement);
});
},
function (error) {
// Handle error trying to get list of files.
});
var nextFileslist = document.getElementById("nextFilesList");
result.neighboringFiles.getFilesAsync(index + 1, -1).done(function (fileList) {
fileList.forEach(function (file) {
// Create an entry in the list for the file.
var fileItemElement = document.createElement("li");
fileItemElement.textContent = file.name;
nextFileslist.appendChild(listItemElement);
});
},
function (error) {
// Handle error trying to get list of files.
});
},
function (error) {
// Handle error trying to get file index.
});
}
}
}
app.addEventListener("activated", activated);
Windows インデックスへのアプリ コンテンツの追加
[インデクサーのサンプルを今すぐ入手する]
Windows 8.1 では、アプリのコンテンツは、Windows インデックスに直接追加できます。インデックスにコンテンツを追加すると、ApplicationIndexedContent フォルダーのクエリ、または新しいアプリ内検索コントロールを使って、アプリのコンテンツをすばやく検索できるようになります。Windows.Storage.Search で設定された新しい API を使うか、"appcontent-ms" ファイルを作成して、ファイル プロパティとコンテンツをインデックスに追加できます。
OneDrive
Windows 8.1 では、OneDrive の 2 つの機能が更新されています。
ファイル ストレージ
Microsoft アカウント (MSA) を持つすべてのユーザーは非常に簡単に、ファイル ピッカーで OneDrive に移動し、アプリで開くファイルやフォルダーを選択できるようになりました。
OneDrive ストレージ管理ツール
Windows 8.1 では、OneDrive ストレージのクォータ管理エクスペリエンスが向上しました。ユーザーは Windows から直接 OneDrive を管理できます。 Windows 8.1 のネイティブ インターフェイスを離れることなく、OneDrive の使用状況の表示、容量プランのアップグレード、OneDrive 上のスペースの解放ができます。
DDS 画像ファイルのサポート
Microsoft DirectDraw Surface (DDS) ファイル形式が、JavaScript と Extensible Application Markup Language (XAML) WebView コントロールを使用している Windows ストア アプリでもサポートされるようになりました。大きなテクスチャでも高速実行できる WebGL アプリを作成できます。
ブロック圧縮と DDS について
ブロック圧縮 (BC) は、DirectDraw Surface (DDS) ファイルでピクセル データを保管するのに使用される圧縮方法です。他の画像ファイル形式とは違って、ブロック圧縮形式はグラフィックス処理ユニット (GPU) が圧縮解除などの処理をすることなく直接サンプリングでき、Windows ストア アプリでテクスチャ リソースの読み込み性能が向上します。BC 形式ではピクセルあたり平均 4 ~ 8 ビットを使用しますが、一般的な RGBA テクスチャはピクセルあたり 32 ビットを使用します。そのため、ブロック圧縮形式は全体的な GPU メモリ使用量も最大 87.5% 削減され、Windows ストア アプリで使用するアセットの量を増やしたり品質を高めることができます。
ブロック圧縮アルゴリズムはいくつかありますが、Windows 8.1 で JavaScript と XAML WebView コントロールを使う Windows ストア アプリでは、DDS ファイル形式で BC1、BC2、BC3 という 3 種類のブロック圧縮しかサポートしていません。CPU によるデコード時間がほぼゼロであるため、ブロック圧縮された DDS 画像は JPEG 画像よりもずっと速く読み込まれ、ブロック圧縮は GPU メモリの使用量が少ないため、多くのテクスチャ リソースを使用できます。ブロック圧縮された DDS ファイルは、標準で搭載されたゲームの背景とテクスチャに最適に画像形式です。
DDS ファイルのブロック圧縮の使用方法
JavaScript または XAML WebView コントロールを使っている Windows ストア アプリで画像アセットをブロック圧縮形式に変換するときは、次の制限を考慮する必要があります。
次の DXGI_FORMAT 列挙値に該当する BC1、BC2、BC3 のブロック圧縮形式だけがサポートされています。
- DXGI_FORMAT_BC1_UNORM
- DXGI_FORMAT_BC2_UNORM
- DXGI_FORMAT_BC3_UNORM
プリマルチプライ済みアルファを使用する必要があります。プリマルチプライ済みアルファ (DXT1、DXT2、DXT4) を明示的に定義した形式を使用する従来の DDS ファイルと、DDS_HEADER_DX10 構造体に有効な DDS_ALPHA_MODE 値 (DDS_ALPHA_MODE_OPAQUE と DDS_ALPHA_MODE_PREMULTIPLIED) を設定した新しい DDS ファイルのどちらもサポートされています。
X 次元と Y 次元は 4 ピクセルの倍数にする必要があります。
DDS のボリューム テクスチャ、キューブマップ、ミップマップ、テクスチャ形式はサポートされていません。
これらの制限に従わない場合、JavaScript または XAML WebView コントロールを使っている Windows ストア アプリで DDS ファイルが読み込まれません。詳しくは、このリンクをご覧ください。
DDS ファイルにブロック圧縮されたアセットを作成すると、マークアップまたは JavaScript 経由で DDS ファイルを読み込むことができます。
HTML
<img src=”sample.dds” />
JavaScript
var img = new Image();
img.src = “sample.dds”;
ブロック圧縮と DirectDraw Surface ファイル形式について詳しくは、「ブロック圧縮」、「DDS 用プログラミング ガイド」、「DDS のリファレンス」をご覧ください。
ブロック圧縮形式の使用条件
先に述べたように、ブロック圧縮した DDS ファイルは、Windows ストア アプリで使用する大きなテクスチャの数を増やし、アプリの読み込み速度を高めるのに大いに役立ちます。ただし、ブロック圧縮した DDS ファイルは GPU のメモリ消費という点では効率的ですが、必要なディスク容量は JPEG よりも増えます。ブロック圧縮した DDS ファイルは、アプリケーション パッケージのローカル アセットとして使用するのが最善です。ネットワーク経由でダウンロードするのに適した形式ではありません。ブロック圧縮した DDS ファイルは Internet Explorer 11 でサポートされていますが、ネットワーク コストが高いため、Web でこのファイル形式を使うことはお勧めできません。
ブロック圧縮した形式は非可逆であるため、他の非可逆形式と同様に、ブロック圧縮形式に変換したときに画像品質が損なわれないように気を付ける必要があります。ブロック圧縮は現実世界の「自然」画像に非常に適していますが、グラデーションや色の変化が急激である場合にアーティファクトが生じることがあります。