C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: SLでImageOpenedイベントの拾い方


(過去ログ 67 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■38799 / inTopicNo.1)  SLでImageOpenedイベントの拾い方
  
□投稿者/ gtk2k (19回)-(2009/07/25(Sat) 10:14:14)

分類:[.NET 全般] 

2009/07/25(Sat) 10:25:39 編集(投稿者)
2009/07/25(Sat) 10:16:45 編集(投稿者)
2009/07/25(Sat) 10:16:04 編集(投稿者)

Silverlight3で言語にVB.NETを使用

やりたいことは画像ファイルを読み込みWritableBitmapを通してピクセルデータを取得することなんだが。
いろいろネットで調べてみて、以下のようなコード組んでみた

Private Sub btnRun_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
Dim img As New Image()
Me.mikuImages.Add(img)
AddHandler img.ImageOpened, AddressOf ImgOpened
img.Source = New BitmapImage(New Uri("hoge.png", UriKind.Relative))
End Sub

Private Sub ImgOpened(ByVal sender As Object, ByVal e As RoutedEventArgs)
Dim img As Image = DirectCast(sender, Image)
Dim wb As New WriteableBitmap(workImage, Nothing)
Dim buffer() As Integer = wb.Pixels
Me.mikuImages(Me.mikuImages.IndexOf(img)) = buffer
End Sub

しかし、ImageOpenedイベントが発生していない、またはImageOpenedイベントハンドラが正しく機能していないらしく
いっこうに、イベントプロシージャーであるImgOpenedメソッドに飛んでくれない。
あーSilverlightしんどすぎ。

どうすれば、正しくイベントを拾うことができるのでしょうか?
引用返信 編集キー/
■38992 / inTopicNo.2)  Re[1]: SLでImageOpenedイベントの拾い方
□投稿者/ お だ (1回)-(2009/07/28(Tue) 22:24:28)
ImageOpened イベントは、エラーが発生することなくイメージ ソースがダウンロードおよびデコードされたときに発生するそうです。
エラーが発生していませんか?エラーの発生は、ImageFailed イベントで拾えるようです。

日本語版の MSDN だと、ImageOpened イベントが載ってないですね。
http://msdn.microsoft.com/ja-jp/library/system.windows.controls.image_members(VS.95).aspx
英語版の MSDN には載ってました。
http://msdn.microsoft.com/en-us/library/system.windows.controls.image.imageopened(VS.95).aspx
引用返信 編集キー/
■39004 / inTopicNo.3)  Re[2]: SLでImageOpenedイベントの拾い方
□投稿者/ gtk2k (35回)-(2009/07/29(Wed) 10:27:06)
No38992 (お だ さん) に返信
> ImageOpened イベントは、エラーが発生することなくイメージ ソースがダウンロードおよびデコードされたときに発生するそうです。
> エラーが発生していませんか?エラーの発生は、ImageFailed イベントで拾えるようです。
>
> 日本語版の MSDN だと、ImageOpened イベントが載ってないですね。
> http://msdn.microsoft.com/ja-jp/library/system.windows.controls.image_members(VS.95).aspx
> 英語版の MSDN には載ってました。
> http://msdn.microsoft.com/en-us/library/system.windows.controls.image.imageopened(VS.95).aspx

ううむ、エラーは発生していないみたい?
ImageFailedイベントをハンドルさせてみたけど、ImageFailedイベントが発生しない。

とりあえず、今はWebClientを使用して、WebClientで画像をダウンロードし、
BitmapImageのSetSourceでストリームをセットすることで対処している。
引用返信 編集キー/
■39014 / inTopicNo.4)  Re[3]: SLでImageOpenedイベントの拾い方
□投稿者/ みきぬ (566回)-(2009/07/29(Wed) 12:42:11)
# 脱線失礼

> SLでImageOpenedイベントの拾い方

勝手に略すのイクナイ!

つい↓を思い出しちゃったぢゃないですか…。
http://www.tkl.iis.u-tokyo.ac.jp/~toyoda/
引用返信 編集キー/
■39015 / inTopicNo.5)  Re[4]: SLでImageOpenedイベントの拾い方
□投稿者/ gtk2k (37回)-(2009/07/29(Wed) 12:50:51)
No39014 (みきぬ さん) に返信
> # 脱線失礼
>
>>SLでImageOpenedイベントの拾い方
>
> 勝手に略すのイクナイ!
>
> つい↓を思い出しちゃったぢゃないですか…。
> http://www.tkl.iis.u-tokyo.ac.jp/~toyoda/

だって、文字数制限されてるんだもん。
引用返信 編集キー/
■39061 / inTopicNo.6)  Re[5]: SLでImageOpenedイベントの拾い方
□投稿者/ お だ (2回)-(2009/07/29(Wed) 21:20:49)
エラーは発生していないんですか。見当外れで申し訳ないです。

実際に Silverlight3 で試してみましたが、絶対パスで指定した場合、ImageOpened イベントが走りました。
相対パスでの指定は、画像ファイルをどこに置いたら良いのかわからず常にエラーになってしまったため、
gtk2k さんの様に、エラーが発生していないが ImageOpened も走らない状況にはなりませんでした。

英語のサイトですが、ここにそれらしい事が書いてありそうでした。が、私は英語殆ど読めないので殆ど内容理解していません。(全く関係無かったらすいません)
http://silverlight.net/forums/p/112642/253949.aspx

試した環境は、ローカル端末のIISを立ち上げ、クロスドメインポリシーファイル(clientaccesspolicy.xml)を IIS のルートに置いてます。
また、Visual Studio からデバッグ実行する場合は、ASP.NET Webサイトでホストしていないとエラーになりました。
(ASP.NET Web サイトでホストしていなくても、IIS のルートに、TestPage.html と xap ファイルを配置して、ブラウザからアクセスした場合はエラーが発生しませんでした。http でアクセスしたら良いのかな?)
以下、試したソース
xaml
<UserControl x:Class="SilverlightApplication6.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480">
  <Grid x:Name="LayoutRoot">
    <StackPanel x:Name="panel">
      <Button Content="ボタン" Click="Button_Click"/>
    </StackPanel>
  </Grid>
</UserControl>
cs
public partial class MainPage : UserControl
{
  public MainPage()
  {
    InitializeComponent();
  }
  void img_ImageFailed(object sender, ExceptionRoutedEventArgs e)
  {
    HtmlPage.Window.Alert("Failed");
  }
  void img_ImageOpened(object sender, RoutedEventArgs e)
  {
    HtmlPage.Window.Alert("Opened");
  }
  private void Button_Click(object sender, RoutedEventArgs e)
  {
    Image img = new Image();
    this.panel.Children.Add(img);
    img.ImageOpened += new EventHandler<RoutedEventArgs>(img_ImageOpened);
    img.ImageFailed += new EventHandler<ExceptionRoutedEventArgs>(img_ImageFailed);
    img.Source = new BitmapImage(new Uri("http://localhost/welcome.png", UriKind.RelativeOrAbsolute));
  }
}

引用返信 編集キー/
■39076 / inTopicNo.7)  Re[6]: SLでImageOpenedイベントの拾い方
□投稿者/ gtk2k (42回)-(2009/07/30(Thu) 00:04:03)
ありがとうございます。
ようやく、原因がつかめました。
こちらでも、イベントが発生しました。
つまりは、「表示」させないとイベントが発生しないのですね。
this.panel.Children.Add(img); // ←ここんところ
こちらでも、LayoutRoot(Grid)に追加したところ、イベントが発生しました。

表示させずに内部でピクセルデータを取得したいという場合は、
やっぱ面倒でもWebClientでDLしないとだめなんか。
ほんとSilverlightしんどすぐる。

解決済み
引用返信 編集キー/
■39081 / inTopicNo.8)  Re[7]: SLでImageOpenedイベントの拾い方
□投稿者/ お だ (3回)-(2009/07/30(Thu) 05:52:57)
解決されたようで良かったです。
どうも私が gtk2k さんのやりたかった事を理解していなかったみたいですね。
画面には表示する必要ないんですよね?

それならば、そもそも UIElement である Image を使わなければ実現できるのではないでしょうか?
Silverligt 3 の BitmapImage は、CreateOptions というプロパティがあり、そこで 画像の取得するタイミングを指定出来るようです。
そのプロパティに値をセットしたら、必要な場合画像を取りに行ってくれるみたいです。(体験談なので、公式の情報ではありません!)

こんな感じで、動作しました。(但し、WritableBitmap の Picxel プロパティにアクセスしたら、System.Security.SecurityException が発生しましたが…)
以下ソース
void img_ImageFailed(object sender, ExceptionRoutedEventArgs e)
{
  HtmlPage.Window.Alert("Failed");
}
void img_ImageOpened(object sender, RoutedEventArgs e)
{
  HtmlPage.Window.Alert("Opened");
  WriteableBitmap w = new WriteableBitmap(sender as BitmapImage);
  // int[] pic = w.Pixels; <- System.Security.SecurityException が発生する!
}
private void Button_Click(object sender, RoutedEventArgs e)
{
  BitmapImage bitImg = new BitmapImage(new Uri("http://localhost/welcome.png", UriKind.RelativeOrAbsolute));
  bitImg.ImageOpened += new EventHandler<RoutedEventArgs>(img_ImageOpened);
  bitImg.ImageFailed += new EventHandler<ExceptionRoutedEventArgs>(img_ImageFailed);
  bitImg.CreateOptions = BitmapCreateOptions.None; // 元の値と同じだが、CreateOptions の setter を走らせないと画像を取りに行かない?
}

解決済み
引用返信 編集キー/
■39100 / inTopicNo.9)  Re[8]: SLでImageOpenedイベントの拾い方
□投稿者/ gtk2k (45回)-(2009/07/30(Thu) 11:10:58)
2009/07/30(Thu) 12:26:59 編集(投稿者)

No39081 (お だ さん) に返信

そういうことだったんですか。
やっと、自分の期待する動作をさせることができました。
重ね重ねありがとうございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -