2018年05月26日
《その394》画像ファイルの読み込み(1)
画像ファイルの読み込み(ファイルピッカーを用いた画像選択)
今回は、画像ファイルを読み込んで表示するアプリです。
読み込むファイルの拡張子は 「.png」「.bmp」「.jpg」の3種類だけです。
読み込むファイルの選択にはファイルピッカーを利用しています。
読込み・表示 だけの単純なアプリです。基本機能だけのプログラムなので、読込みエラー等については未対策です。
アプリの開始画面です。
ボタンをクリックするとファイルピッカーが表示されます。
選択した画像が表示されます。
以下は、MainPage.xaml.cpp です。
//
// MainPage.xaml.cpp
// MainPage クラスの実装。
//
#include "pch.h"
#include "MainPage.xaml.h"
#include <fstream>
using namespace App13;
using namespace Platform;
using namespace Windows::Foundation;
using namespace Windows::Foundation::Collections;
using namespace Windows::UI::Xaml;
using namespace Windows::UI::Xaml::Controls;
using namespace Windows::UI::Xaml::Controls::Primitives;
using namespace Windows::UI::Xaml::Data;
using namespace Windows::UI::Xaml::Input;
using namespace Windows::UI::Xaml::Media;
using namespace Windows::UI::Xaml::Navigation;
MainPage::MainPage()
{
InitializeComponent();
}
void App13::MainPage::
Button_Click(Platform::Object^ sender,
Windows::UI::Xaml::RoutedEventArgs^ e)
{
// ファイルピッカーを設定します。
auto fP
= ref new Windows::Storage::Pickers::FileOpenPicker();
fP->ViewMode
= Windows::Storage::Pickers::PickerViewMode::Thumbnail;
fP->SuggestedStartLocation
= Windows::Storage::Pickers::PickerLocationId::PicturesLibrary;
fP->FileTypeFilter->Append(".png");
fP->FileTypeFilter->Append(".bmp");
fP->FileTypeFilter->Append(".jpg");
// ファイル ピッカーを表示します。
concurrency::create_task(fP->PickSingleFileAsync())
.then([this](Windows::Storage::StorageFile^ file)
{
// pickedFile : 選択ファイル名
Platform::String^ pickedFile = file->Name;
// 内部フォルダへのパスを取得します。
auto localFolder
= Windows::Storage::ApplicationData::Current->LocalFolder;
// 内部フォルダにファイルをコピーします。
concurrency::create_task(file->CopyAsync(
localFolder,
pickedFile,
Windows::Storage::NameCollisionOption::ReplaceExisting))
.then([this](Windows::Storage::StorageFile^ copiedFile)
{
// コピーしたファイルへのパスを取得します。
auto Path2 = copiedFile->Path;
std::wstring filePath (Path2->Begin());
// in : 入力用ファイルストリーム(バイナリモード)
std::ifstream in(filePath, std::ios::binary);
std::vector<char> data(
(std::istreambuf_iterator<char>(in)),
(std::istreambuf_iterator<char>())
);
auto bitmapImage
= ref new Windows::UI::Xaml::Media::Imaging::
BitmapImage();
auto stream
= ref new Windows::Storage::Streams::
InMemoryRandomAccessStream();
auto writer
= ref new Windows::Storage::Streams::
DataWriter(stream->GetOutputStreamAt(0));
writer->WriteBytes(ArrayReference<unsigned char>(
(unsigned char*)data.data(), data.size())
);
Concurrency::create_task(
writer->StoreAsync()).then([=](unsigned bytesStored)
{
return bitmapImage->SetSourceAsync(stream);
});
img->Source = bitmapImage;
});
}
);
}
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/7702508
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック