第1回 画像の裏を表示する 1

本文将通过10个步骤详细介绍如何使用Silverlight4创建一个能够展示图像前后面的程序,包括环境搭建、功能实现、代码编写及测试过程。通过这个教程,读者可以学习到如何在Silverlight环境中实现图像翻转和透明显示的效果。

今回は、今まで解説してきたSilverlight 4のサンプルで紹介しきれなかったものを、10回に亘ってTipsという形で紹介します。いろいろな表現方法を紹介していますので、きっと表現豊かなページ作成に役立つと思います。

第1回では、画像の“裏”を表示するプログラムを紹介します。

今回の筆者の開発環境は、Windows 7 Professional+SP1、Visual Studio Ultimate+SP1、Expression Blend4、Silverlight 4です。

Windows 7のSP1は下記URLよりダウンロードできます。
→ Windows 7 および Windows Server 2008 R2 Service Pack 1

Visual Studio 2010のSP1は下記URLよりダウンロードできます。
→ Microsoft Visual Studio 2010 Service Pack 1

以上を必要に応じてインストールしてください。

まず初めに、このプログラムで実装する機能の動作を、下記に解説しておきます。通常、Expression Blend4(以下Blend4)で、画像等を180度反転させると、画像が裏向きに透けて表示されます(図1)。このサンプルでは、[裏画面へ]ボタンをクリックすると、画像が反転し、何もない真っ黒な面に文字が表示された裏を表示させます。[表画面へ]ボタンをクリックすると画像が表示されます(図2)。

図1:通常は画像を180度反転させると、画像が裏向きに透けて表示される(クリックで拡大)

図2:画像の裏面が表示される(クリックで拡大)

今回のサンプルは以下よりダウンロードできます。
→ 今回のサンプルファイル(963KB)

新規プロジェクトの作成

早速サンプルを作っていきましょう。本稿では開発言語にVisual Basicを用います。

Visual Studio 2010(以下VS 2010)のメニューから[ファイル(F)/新規作成(N)/プロジェクト(P)]を選択します。次に、「Silverlight アプリケーション」を選択して、「名前(N)」に任意のプロジェクト名を指定します。ここでは「SL4_ImageFrontBack」という名前を付けています。

ソリューションエクスプローラー内にImageというフォルダを作成して、「菜の花」の画像と、裏面となる黒い画像の2枚を追加しておきます。ダウンロードされたサンプル・ファイルには画像は追加済みです。

コントロールの配置

<UserControl>要素のWidthに800、Heightに600と指定します。ツールボックスからBorder、Grid、Image、TextBlock、Buttonコントロールを図3のように配置します。ImageコントロールにはImageフォルダ内の画像を指定します。XAMLコードはリスト1のように書き出されます。

図3:Border、Grid、Image、TextBlock、Buttonコントロールを配置した(クリックで拡大)
リスト1 書き出されたXAMLコード(MainPage.xaml)
01(1)表(おもて)となる面には、<Border>要素内に<Grid>要素を配置し、<Grid>要素内に<Image>と<Button>要素を配置しています。それぞれの要素には任意のx:Nameを指定しています。表となる<Border>要素にはImageBorderというx:Nameを付けています。
02 
03(2)裏となる面には、(1)の要素以外に<TextBlock>要素を配置しています。裏となる<Border>要素にはBackBorderというx:Nameを付けています。
04 
05<UserControl x:Class="SL4_ImageFrontBack.MainPage"
10  mc:Ignorable="d"
11  d:DesignHeight="300" d:DesignWidth="400" Width="800" Height="600">
12 
13    <Grid x:Name="LayoutRoot" Background="White">
14    <Border BorderBrush="Silver" BorderThickness="1" Height="280" HorizontalAlignment="Left" Margin="108,98,0,0" x:Name="ImageBorder" VerticalAlignment="Top" Width="320"> ■(1)
15        <Grid Height="280" x:Name="ImageGrid" Width="320">
16            <Image Height="240" HorizontalAlignment="Left" Margin="0,-1,0,0" x:Name="FlowerImage" Stretch="Fill" VerticalAlignment="Top" Width="320" Source="/SL4_ImageFrontBack;component/Image/菜の花.jpg" />
17            <Button Content="裏画面へ" Height="31" HorizontalAlignment="Left" Margin="6,243,0,0" x:Name="ToBackButton" VerticalAlignment="Top" Width="116"/>
18        </Grid>
19    </Border>
20   
21    <Border BorderBrush="Silver" BorderThickness="1" Height="280" HorizontalAlignment="Left" Margin="108,98,0,0" x:Name="BackBorder" VerticalAlignment="Top" Width="320" > ■(2)
22        <Grid Height="280" Name="BackGrid" Width="320">
23            <Image Height="240" HorizontalAlignment="Left" Margin="0,-1,0,0" Name="Image1" Source="/SL4_ImageFrontBack;component/Image/裏画像.jpg" Stretch="Fill" VerticalAlignment="Top" Width="320" />
24            <Button Content="表画面へ" Height="31" HorizontalAlignment="Left"  Margin="6,243,0,0" x:Name="ToFrontButton" VerticalAlignment="Top" Width="116"/>
25            <TextBlock Height="25" HorizontalAlignment="Left" Margin="176,204,0,0" x:Name="TextBlock1" Text="Photo by Sei Yakushiji" VerticalAlignment="Top" Width="130" Foreground="Gold" />
26        </Grid>
27    </Border>
28  </Grid>
29</UserControl>

次に、裏となる面を<Border>要素ごと表となる面の上に重ねます(図4)。

図4:表となる面に裏となる面を重ねる

裏の面が前面に表示されます。裏の面に該当する、Borderコントロールのプロパティの[可視性]を展開して表示される、Visibilityプロパティに、Collapsedを指定して非表示としておきます。SP1の入っていないVS2010上では裏面が非表示になりませんが、Blend4上では非表示となって表面(おもてめん)が表示されます。SP1の入ったVS2010ではVS2010上でも裏面が非表示になり、表面が表示されます。

ソリューションエクスプローラー内の、MainPage.xamlを選択し、マウスの右クリックで表示されるメニューの、「Expression Blendを開く(X)」を選択し、Blend4を起動します。


解析文本数据 処理する差分総数:2 現在処理進捗:1/2 変更前仕様書内容分析 時間がかかる:9.38s 変更後仕様書内容分析する 時間がかかる:8.70s 変更前後仕様書差異抽出する 時間がかかる:3.38s AIが差異点背景情報理解する 時間がかかる:0.00s AIが需要点判定行う正在处理AI判定1/1時間がかかる:328.58s 差分解析結果SCLファイルに書き込む已完成批次 1/1,時間がかかる:8.84s 処理完了:1/2 現在処理進捗:2/2 テンプレートに一致せず、デフォルトテンプレートが使用されています 変更前仕様書内容分析 時間がかかる:4.68s 変更後仕様書内容分析する 時間がかかる:4.73s 変更前後仕様書差異抽出する 時間がかかる:0.34s AIが差異点背景情報理解する 時間がかかる:0.00s AIが需要点判定行う正在处理AI判定1/1時間がかかる:76.83s 差分解析結果SCLファイルに書き込む已完成批次 1/1,時間がかかる:7.18s 処理完了:2/2 完了した仕様差分: 合計 2,成功 2,失敗 0 結果詳細: SCL_MET-B_SEAREM-CSTD-1-XX-X-C7-575D-A.xlsx 総差分数 35 テキスト差分数 0 表差分数 32 画像差分数 0 グラフィック差分数 3 変更前解析結果 変更後解析結果 差分結果 SCL_MET-G_SETTING-CSTD-0-XX-X-C7-305D-a.xlsx 総差分数 25 テキスト差分数 2 表差分数 23 画像差分数 0 グラフィック差分数 0 比如我输入这一段消息 那我的输出应该是SCL_MET-B_SEAREM-CSTD-1-XX-X-C7-575D-A.xlsx机器差分耗时为:(第一个时间段相加) SCL_MET-G_SETTING-CSTD-0-XX-X-C7-305D-a.xlsx机器差分耗时为:(第二个时间段相加) 耗时的单位是h不是s
09-09
@HiltViewModel class JAFRSHO31020ViewModel @Inject constructor( private val localStorage: LocalStorageRepository ) : JafViewModel() { /** 手書きラインメモリ*/ // private val handDrawnLineMemory = ArrayDeque() private val _lines = mutableStateOf<ArrayDeque<HandDrawnLineModel>>(ArrayDeque()) val handDrawnLineMemory: State<ArrayDeque<HandDrawnLineModel>> = _lines /** 線色*/ var lineColor: String = "" /** 線太さ*/ var lineSize: String = "" /** 画像ファイル*/ var file: File = File("") /** * システムイベント処理 * @param event */ override fun onEvent(event: JafEvent) { when (event) { is JafEvent.Companion.Initialize -> { launchWithLoading { // onPopupDisplay() } } } } /** * アクション処理 * * @param action アクション */ override fun onAction(action: JafAction) { when (action) { // is JAFRSHO31020Action.OnRsSho -> { // launchSilent { /onPopupDisplay()/ } // } } } /** * 【JAFRSHO31020E001】画面表示 * @param filePathParam 画像ファイルパス */ fun onPopupDisplay(filePathParam: String) { //インスタンス変数.画像ファイル取得する。 file = File(filePathParam) if (!file.exists()) { file = File("[実行フォルダー]/Damage/original.jpg") } viewModelScope.launch { // コルーチン起動する //インスタンス変数.線設定する。 val lineColorTmp: String? = localStorage.getMCarWorkSettingInfoList().find { it.parameterName == "線色" } ?.let { it.parameterValue } if (lineColorTmp.isNullOrEmpty()) { lineColor = "#FF0000"//赤色 } else { lineColor = lineColorTmp } //インスタンス変数.線サイズ設定する。 val lineSizeTmp: String? = localStorage.getMCarWorkSettingInfoList() .find { it.parameterName == "線サイズ" } ?.let { it.parameterValue } if (lineSizeTmp.isNullOrEmpty()) { lineSize = "1"//1pt } else { lineSize = lineSizeTmp } } } /** * 【JAFRSHO31020E003】×(閉じる) - 押下 */ fun onWindowClose() { //未確定手書き描画データ存在判断する。 if (_lines.value.isNotEmpty()) { showMessage( Message.JAFRSHO99010IC00086.id, listOf("未確定編集画像があります。破棄して戻りますか?"), onNo = { navigateBack() } ) } } /** * 【JAFRSHO31020E004】1つ前削除 - 押下 */ fun onDelete() { if (_lines.value.isEmpty()) { } else { _lines.value.removeLast() } //手書き描画データ保持したメモリ情報直前データ解放する。 } /** * 删除全部线条 */ fun clearAllLines() { _lines.value.clear() } }想要实现照片的基础编辑功能,删除前一步,删除全部,保存当前编辑的照片,用@Composable来进行画面设计,请帮我完善viewmodel层,以及适配的画面
最新发布
10-16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值