DOBON.NETプログラミング道掲示板

■ 「新規作成」から投稿できます。
■ マルチポストされた投稿を見つけたときは、その投稿に返信することによりご報告ください。その際は匿名で投稿し、マルチポストされている場所を併記してください。
■ スパム対策のため、メールアドレスの先頭に"_"という文字が付加されています。
RSS 2.0 RSS 2.0 | RSS 0.91 | 携帯電話用 | 自分専用のアイコンを使用するには | 掲示板への要望 | 管理人に連絡 | お気楽掲示板
■ 24時間以内に作成されたスレッドは New で表示されます。
■ 24時間以内に更新されたスレッドは UpDate で表示されます。

記事リスト ( )内の数字はレス数
NomalExcel Com オブジェクトの増殖(13) | NomalRichTextBoxのテキストをpictureBOXへ(12) | NomalPictureBoxの画像を連続保存(11) | NomalVB.NetでVB6.0と同じFontを指定しても同様に印刷されない(9) | Nomal作成した白黒画像をWordに貼り付けてから「図として保存」(8) | Nomal重なったPictureBox同士を透過する方法(7) | Nomalvb.netでExcelファイル操作(7) | NomalTreeViewの現在位置とDataGridViewの現在位置を合わせたい(7) | Nomalラジオボタンの一括設定(7) | NomalLabelで文字単位の背景色(7) | NomalTEXTBOXのプロパティを文字列に(7) | NomalDataAdapter.Updateで構文エラー(6) | Nomalキーボード+バーコードでキーボード入力を無効にしたい(6) | Nomaljumbo icon(256x256)が存在するか知る方法(6) | Nomal画像のスクロール(6) | Nomalタイマーの一括処理(6) | Nomal先頭に空白(スペース)があるファイルを読み込んでRichTextBoxへ書き出すとスペースが削除える(6) | NomalタッチキーボードでIMEを自動で切替えたい(6) | NomalPDFをフォーム上で表示させる方法につきまして(6) | Nomal特定のPCだけ発生する「パディングは無効なので削除できません」のエラーの原因(6) | Nomalシステムドライブ以外へのページング設定が反映されない(5) | Nomal全角シフト中にアクセスキーが効かない(5) | NomalVB.NETからcmdでpingを実行した時の結果(5) | NomalTabPageの背景色(5) | Nomalstyle.displayだと効率悪いから違うやり方をしたいです。(5) | Nomalグリッド表示レコードをJSONに変換(5) | NomalSeleniumで開いているページのTableを編集したい(5) | NomalMP4動画を再生する方法について(5) | NomalLableのカラー色を文字変数から変更したい(5) | NomalDataGridViewの特定セルにボタンを配置する方法(5) | Nomalブラウザでコピーした透過PNGを貼り付けたい(4) | NomalWebView2によるスクレ―ピング(4) | NomalC#でJpeg圧縮のTiffファイルを作成したい(4) | NomalDataGridViewのVirtualModeを有効した場合の実装方法(4) | Nomalテーブルを順番通りに直すプログラムを外部で読み込めるようにしたいです。(4) | Nomalソケット通信入門 ひらがな(4) | Nomal時間変数(文字列)の扱い(4) | NomalTreeViewとDataGridViewのスクロールを同期(シンクロ)させたい(4) | Nomalフォームのリサイズ時にDataGridViewが再描画されない(4) | NomalPDFをフォーム上で表示させる方法につきまして(4) | NomalアプリでHDMIへ出す解像度を変えたい(4) | Nomal画像の中心を基点に回転(4) | NomalDataGridViewの行ヘッダーに行番号を表示した時のエラー(4) | Nomal抽象クラスで実装したクラスの情報を知る(3) | Nomal兆億万表記の文字列を数値に変換できる?(3) | NomalGetDirectoriesでルートを指定するとエラーになる(3) | NomalLinqにおける明示的型指定の方法(3) | Nomalデータベースからのテーブル名一覧の効率的な取得方法(3) | NomalC# Chart X軸上のグラフ表示(3) | NomalVB.NETでBluetoothデバイスの電池残量を取得する方法(3) | NomalWindowsフォームデザイナについて(3) | NomalDrawstringでの透過文字作成(3) | Nomalワンタイムパスワードのサイトに自動ログインしてアクセストークンを得る(3) | NomalJSONの複雑な入れ子内部の値を取りたい。(3) | Nomalシステム時計の設定(3) | NomalVisual Basicでエラーが出る(3) | Nomal継承元フォームで各フォームのボタン動作を検知したい(3) | NomalRichTextBoxへのドラッグ&ドロップしたExcelファイルの扱い(3) | NomalDataGridViewの複数行選択で歯抜け選択を無効にしたい(2) | Nomalforeachでループ回数を取得(2) | Nomalbitmapが保存できない(2) | Nomal特定ピクセルで画像を読み込みたい(2) | NomalDataGridViewでAlt+Enterで改行したい(2) | NomalProcessクラスからbatファイル実行後、KILLできない(2) | Nomal画面遷移(モーダルとモードレス)(2) | Nomal2つのradの数値から1つの角度を求めるコードを改善できますか?(C++)(2) | Nomalコンソールアプリで、WebView2の利用(2) | NomalEntity Frameworkは、使えるか?(2) | NomalC#のlong型でオーバーフローになる(2) | Nomal正規表現のパターン表記方法(2) | Nomalこういた物を作れますか?(2) | Nomalvb.netでのExcelファイルそうさ(2) | Nomalファイルとして配置したマニフェストを優先したい(2) | NomalVB2022でクリスタルレポートが開けない(2) | Nomalエクセルのみ監視ができない(2) | NomalExcelの数値 -> 日付みたいな関数?(2) | NomalSpinWait()を使う理由(2) | Nomalantecedentってなんですか?(2) | NomalRGB値の所得(2) | NomalVB.net からAccessDBへの接続(2) | NomalテキストボックスのValidatingイベントよりも先に発生するボタン発生イベントは何でしょう?(2) | NomalWindowsエクスプローラからのドラッグ&ドロップ(2) | Nomalクリックイベントでexeを作成できるか(2) | Nomalc#で日付型の定義の仕方で質問があります。(2) | Nomal列車の時間ごとの位置情報を表示したいです。(2) | NomalUrlにアクセスするとダウンロードされるファイルを捕まえる(2) | Nomalタブレット等でスワイプによるスクロールを実装(2) | Nomalフォントに登録されていない文字の検出(1) | Nomaloledbでdatatableを取得するときにエラーになる(1) | Nomal証券会社へのログイン(1) | Nomalツールボックスにtableadapterが表示されない(1) | Nomalアセンブリ情報が載らない(1) | Nomal二次元マップから値の取得(1) | NomalDataGridViewのドロップダウンリストの表示と選択後の値を分けたい(1) | NomalVSTOによるエクセルアドインのインストーラーでのアップデート(1) | Nomalユーザーフォームに埋め込んだAutoCADの変化を捉える(0) | Nomalクリスタルレポート 明細部のサブレポート(0) | Nomalインストーラにて、ローミングフォルダにファイルを配置したい(0) | NomalChart X軸上の描画を切り替えたい(0) |



■記事リスト / ▼下のスレッド
■35611 / 親記事)  ブラウザでコピーした透過PNGを貼り付けたい
□投稿者/ よっし〜 一般人(1回)-(2024/06/07(Fri) 12:18:00)
  • アイコン環境/言語:[VB.NET2013 Win7] 
    分類:[.NET] 

    お疲れ様です。
    現在ブラウザ上に表示されている画像をフォームのPictureBoxに表示するソフトを作成しております。
    ブラウザに表示されている画像で「画像をコピー」しクリップボード経由で「Dim Img As Image = My.Computer.Clipboard.GetImage()」
    すると背景が真っ黒になります。
    画像が透過PNGの為だと思っておりますが、この画像の背景を白にしてPictureBoxに表示する方法はありませんでしょうか?

    If My.Computer.Clipboard.ContainsImage() Then
    Dim Img As Image = My.Computer.Clipboard.GetImage()
    PictureBox1.Image = Img
    End If

    ちなみに透過PNGブラウザで一旦保存し、そのPNGファイルを加工する方法も行いましたが、クリップボードに送られた段階
    で背景が黒く塗られている様で、うまく行きません。

    Using pngImage As Image = Image.FromFile(pngFilePath)
    Using bmp As New Bitmap(pngImage.Width, pngImage.Height)
    Using g As Graphics = Graphics.FromImage(bmp)
    g.Clear(Color.White)
    g.DrawImage(pngImage, 0, 0, pngImage.Width, pngImage.Height)
    End Using
    bmp.Save(OutputFile, ImageFormat.Png)
    End Using
    End Using

    以上、宜しくお願いいたします。
違反を報告
引用返信

▽[全レス4件(ResNo.1-4 表示)]
■35612 / ResNo.1)  Re[1]: ブラウザでコピーした透過PNGを貼り付けたい
□投稿者/ 魔界の仮面弁士 大御所(1573回)-(2024/06/07(Fri) 14:13:32)
  • アイコンNo35611に返信(よっし〜さんの記事)
    >「Dim Img As Image = My.Computer.Clipboard.GetImage()」
    > すると背景が真っ黒になります。

    CF_BITMAP が取得されたためでしょう。
    取得フォーマットの問題ですね。


    たとえば、下記を Edge からコピーしてみた場合、
    クリップボードには 6 種類のデータが保持されました。
    https://ascii.jp/img/2021/04/11/3186022/l/33f2a9acb9788a6d.png

    CF_PNG ("PNG") ⇒ 透過のPNG画像(460x460)
    CF_DIBV5 (17) ⇒ 黒背景のデバイス非依存ビットマップ(460x460)
    CF_HTML ("HTML Format") ⇒ img タグ入りのHTML(終端nullあり、CRLF改行)
    ("Chromium internal source URL") ⇒ URL文字列(終端nullあり、改行なし)
    CF_BITMAP (2) ⇒ ビットマップハンドル (HBITMAP)
    CF_DIB (8) ⇒ 黒背景のデバイス非依存ビットマップ(460x460)

    ということで修正案。

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
      Dim c = Clipboard.GetDataObject()
      Dim img As Image = Nothing
      If c.GetDataPresent("PNG", False) Then
        Dim o = TryCast(c.GetData("PNG"), System.IO.MemoryStream)
        If o IsNot Nothing Then
          img = Image.FromStream(o)
        End If
      ElseIf c.GetDataPresent(GetType(Image)) Then
        img = DirectCast(c.GetData(GetType(Image)), Image)
      End If
      PictureBox1.Image = img
    End Sub
違反を報告
引用返信
■35613 / ResNo.2)  Re[2]: ブラウザでコピーした透過PNGを貼り付けたい
□投稿者/ よっし〜 一般人(3回)-(2024/06/07(Fri) 15:14:46)
  • アイコン魔界の仮面弁士さん、早速のご教示、有り難うございます。

    一応お教え頂いたソースを新しいプロジェクトにして作成し、
    https://ascii.jp/img/2021/04/11/3186022/l/33f2a9acb9788a6d.png
    をブラウザでコピーし、Buttonを押してみたのですが、
    PictureBox1.Image = img
    で「img」はNohingでした。(画像が取れていない様です)

    で、少し気になったのですが、ブラウザによって動作(内容)は変わるものでしょうか?
    例として同じ「33f2a9acb9788a6d.png」をブラウザ上でコピーしワードパッドに貼って見ました。
    FireFox:背景は白(透過)でペーストされました
    Crome:背景は黒でペーストされました

    お教え頂いたソースでは・・・
    Crome:画像が表示されました
    FireFox:PictureBox1.Image = imgのimgがnothingになりました。

    同じコピーでも形式が変わるって事なのでしょうか??

    以上、宜しくお願いいたします。


違反を報告
引用返信
■35614 / ResNo.3)  Re[3]: ブラウザでコピーした透過PNGを貼り付けたい
□投稿者/ 魔界の仮面弁士 大御所(1574回)-(2024/06/07(Fri) 16:11:01)
  • アイコンNo35613に返信(よっし〜さんの記事)
    > 同じコピーでも形式が変わるって事なのでしょうか??
    クリップボードにデータを送信する処理というのは、
    それぞれのアプリケーションの実装依存になっていますので、
    ブラウザーがによって異なる形式になることは十分にありえます。


    > 例として同じ「33f2a9acb9788a6d.png」をブラウザ上でコピーしワードパッドに貼って見ました。
    これも同様。
    クリップボードには、複数のデータ形式が同時に保持されることが多いですが
    その場合、どの形式を採用するかは、添付先のアプリケーション依存です。
    Excel でも、"形式を選択して貼り付け" というモードがありますよね?

    複数のフォーマットをサポートしているアプリの場合、
    (1) 列挙されたフォーマットのうち、最初の形式を採用
    (2) サポートしている形式に優先度をつけ、優先順位の高いフォーマットを優先
    などの違いが生じることがあります。

    たとえば先の私のサンプルは (2) の実装であり、
    "PNG" 優先、無ければ Image を採用…という処理になっているわけです。


    > https://ascii.jp/img/2021/04/11/3186022/l/33f2a9acb9788a6d.png
    > FireFox:PictureBox1.Image = imgのimgがnothingになりました。
    個人的には、Firefox は苦手なんですよね…。
    Child-Tree 系の掲示板に繋ぐと、全角投稿者名などの cookie が腐ることがあったりするので。
    サイト側の問題だといえばそれまでなんですが。


    それはさておき、相手が Firefox や Internet Explorer ならば
     Dim s = Clipboard.GetFileDropList()
     If s.Count > 0 Then
      PictureBox1.LoadAsync(s(0))
      Return
     End If
    で行けるんじゃないですかね?

    試しに FireFox を再インストールして確認してみたところ、
    Internet Explorer および Firefox の場合は、
    下記の 14 種類の形式がクリップボードに含まれていました。


    【Internet Explorer 11 (Win10 22H2) で画像をコピーした場合】
     #01 "DataObject"
     #02 CFSTR_UNTRUSTEDDRAGDROP (50519)
     #03 "msSourceUrl"
     #04 CF_HDROP (15)
     #05 CFSTR_INETURLW (49483)
     #06 CF_DIB ★黒背景画像
     #07 "HTML Format"
     #08 CF_UNICODETEXT (13)
     #09 CF_TEXT (1)
     #10 "Ole Private Data"
     #11 CF_LOCALE (16)
     #12 CF_OEMTEXT (7)
     #13 CF_BITMAP (2) ★黒背景画像
     #14 CF_DIBV5 (17) ★黒背景画像


    【Firefox (ver 126.0.1 64bit) で画像をコピーした場合】
     #01 "DataObject"
     #02 "text/html"
     #03 "HTML Format"
     #04 "text/_moz_htmlinfo"
     #05 "text/_moz_htmlcontext"
     #06 "application/x-moz-file-promise-url"
     #07 "application/x-moz-file-promise-dest-filename"
     #08 CF_HDROP (15)
     #09 CFSTR_PREFERREDDROPEFFECT (49472)
     #10 "application/x-moz-nativeimage" ※取得できない
     #11 CF_DIBV5 (17) ★黒背景画像
     #12 CF_DIB (8) ★黒背景画像
     #13 "Ole Private Data"
     #14 CF_BITMAP (2) ★黒背景画像


    ※"application/x-moz-nativeimage" の場合に HGLOBAL が NULL となるのはバグらしい?
    https://bugzilla.mozilla.org/show_bug.cgi?id=255686
違反を報告
引用返信
■35615 / ResNo.4)  Re[4]: ブラウザでコピーした透過PNGを貼り付けたい
□投稿者/ よっし〜 一般人(4回)-(2024/06/07(Fri) 17:36:16)
  • アイコン魔界の仮面弁士さん、早速のご教示有り難うございます。

    > それはさておき、相手が Firefox や Internet Explorer ならば
    >  Dim s = Clipboard.GetFileDropList()
    >  If s.Count > 0 Then
    >   PictureBox1.LoadAsync(s(0))
    >   Return
    >  End If
    > で行けるんじゃないですかね?

    本当ですね。普通に表示出来ました。
    ただFireFoxはいけましたが、CromeやEdgeも対象としたいので、先にご教示頂きました
     Dim c = Clipboard.GetDataObject()
      Dim img As Image = Nothing
      If c.GetDataPresent("PNG", False) Then
        Dim o = TryCast(c.GetData("PNG"), System.IO.MemoryStream)
        If o IsNot Nothing Then
          img = Image.FromStream(o)
        End If
      ElseIf c.GetDataPresent(GetType(Image)) Then
        img = DirectCast(c.GetData(GetType(Image)), Image)
      End If
      PictureBox1.Image = img
    との合わせ技で解決出来そうです。
    長い間悩んでおりました。どうも有り難うございました。


解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-4]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35535 / 親記事)  WebView2によるスクレ―ピング
□投稿者/ Wan 付き人(81回)-(2023/11/10(Fri) 17:06:14)
  • アイコン環境/言語:[VisualBasic2019 Windows10 Basic Framework4.7.2] 
    分類:[.NET] 

    WebView2を使って、スクレ―ピングを考えています。クラス名でTableを抽出しtrとtdで構成された表をJavaScriptで二次元配列に代入し、returnで返してたつもりです。が、DataTableの変数で受け取れません。途方に暮れています。どなたか?詳しい方いらっしゃいましたら教えて頂けないでしょうか?
    スクレ―ピングについては、複数ページに渡るので、WebView2_NavigationCompletedが発生するたびに、DataTableに追加し続けるコードにしたいのが最終目標です。

    Dim DataTable_Scraping As New DataTable
    DataGridView1.DataSource = DataTable_Scraping

    Private Async Sub WebView2_NavigationCompleted(sender As Object, e As CoreWebView2NavigationCompletedEventArgs) Handles WebView21.NavigationCompleted
    Dim js As New System.Text.StringBuilder
    js.AppendLine("const hyou=[];let i=0;")
    js.AppendLine("var TrElems = document.getElementsByClassName('Tableが含まれるクラス名')[0].getElementsByTagName('tr');")
    js.AppendLine("Array.prototype.forEach.call(TrElems, function(TrElem) {")
    js.AppendLine(" hyou.push([]);")
    js.AppendLine(" var TdElems = TrElem.getElementsByTagName('td');")
    js.AppendLine(" Array.prototype.forEach.call(TdElems, function(TdElem) {")
    js.AppendLine(" hyou[i].push(TdElem.textContent);")
    js.AppendLine(" });")
    js.AppendLine(" i=i+1;")
    js.AppendLine("});")
    js.AppendLine("return hyou;")

    DataTable_Scraping = Await WebView21.ExecuteScriptAsync(js.ToString())
    '読み込み結果を判定
    If e.IsSuccess Then
         ‘ここで次のページへの移動用の要素をクリックしている。動作確認済み
         ‘getElementsByClassName('****')の要素数が1の場合は、終わり
    Await WebView21.ExecuteScriptAsync(
    "document.getElementsByClassName('****')[1].getElementsByTagName('a')[0].click();")
    Else
    Console.WriteLine(e.WebErrorStatus)
    End If
    End Sub

違反を報告
引用返信

▽[全レス4件(ResNo.1-4 表示)]
■35536 / ResNo.1)  Re[1]: WebView2によるスクレ―ピング
□投稿者/ Wan 付き人(82回)-(2023/11/10(Fri) 17:16:18)
  • アイコン追伸

    return hyou;の部分を
    console.table(hyou)とすると
    Edgeの開発者ツール-コンソールで動かして表として表示されますので、
    JavaScript上では、表形式になっているようです。

    また、varをletやconstに変えると、Edgeのコンソール上でも、上手く動かない理由も教えて頂ければ幸いです。



違反を報告
引用返信
■35537 / ResNo.2)  Re[2]: WebView2によるスクレ―ピング
□投稿者/ Hongliang 大御所(646回)-(2023/11/11(Sat) 18:36:02)
  • アイコンVisual Studio 2015から複数行リテラルを扱えるようになったので、文字列が固定であれば変にStringBuilder使うよりリテラルで書いた方が見やすいしパフォーマンスも良いです。

    ExecuteScryptAsyncで実行されるスクリプトは、最後の式を評価してそれを返値とするような挙動になります。
    なので、変数hyouの内容を返値としたいのであれば、単に変数を記述します。
    × return hyou;
    ○ hyou;
    あるいは、以下のように無名関数の呼び出しに全体を変換する方法もあります。
    js = "(function() {
    const hyou = [];
    色々処理する;
    return hyou; })()"

    https://learn.microsoft.com/en-us/dotnet/api/microsoft.web.webview2.core.corewebview2.executescriptasync?view=webview2-dotnet-1.0.2088.41
    ExecuteScriptAsyncの返値(Await結果)は文字列、String型です。
    当然ながらDataTable型の変数に直接代入することはできません。
    この文字列はスクリプトの結果をJSON.stringify()したJSON形式なので、一般的にはデシリアライズして.NET上のオブジェクトとして扱います。
    JSONのデシリアライザとしては、System.Text.JsonでもJson.NETでもお好みのものを使えばいいでしょう。.NET 4.xで組み込みなのはDataContractJsonSerializerというのがありましたっけ。
    ざっと見た様子では、JavaScript上では「「文字列の配列」の配列」のようなので、VB上ではString型の配列の配列、つまり String()() 型としてデシリアライズできます。
    DataTableへはこのString()()から手動で移し替えてください。

    > また、varをletやconstに変えると、Edgeのコンソール上でも、上手く動かない理由も教えて頂ければ幸いです。
    ExecuteScriptAsycで渡したJavaScript内で定義したりした変数はそのまま残ります。
    constやletで宣言した変数は再宣言不可能なので、もう一度ExecuteScriptAsyncしたりするとエラーになります。
    ちなみにconstにせよletにせよブロックスコープなので、上の方で示した無名関数を使う場合、
    (function() { const hyou = []; ... })()
    このhyouはこの無名関数内でのみ有効なので、再度呼び出しても問題ありません。

    何度も使用するJavaScript関数なら、
    CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync
    で登録しておけば便利です。
違反を報告
引用返信
■35538 / ResNo.3)  Re[1]: WebView2によるスクレ―ピング
□投稿者/ 魔界の仮面弁士 大御所(1566回)-(2023/11/11(Sat) 22:04:19)
  • アイコン
    No35535に返信(Wanさんの記事)
    > スクレ―ピング
    「スクレーピング」が
    「スクレ―ピング」になっていて
    似非日本語感を微妙に覚えるなど(
    
    
    > WebView2を使って、スクレ―ピングを考えています。
    RSS をクロールするだけでで要件を満たせるなら、
    XDocument だけで簡単に済むのですけれどね…。
    ひとまず、ここの掲示板の RSS を拾ってみた例。
    
    
    Imports System.Xml.Linq
    Public Class Form1
        Private WithEvents dgv As DataGridView
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            dgv = New DataGridView() With {.Dock = DockStyle.Fill, .ReadOnly = True, .AllowUserToAddRows = False}
            Controls.Add(dgv)
            Dim doc = XDocument.Load("https://dobon.net/cgi-bin/vbbbs/rss.cgi?ver=2.0")
            Dim items = From item In doc...<item>
                        Select item.<title>.Value,
                            item.<link>.Value,
                            pubDate = Date.Parse(item.<pubDate>.Value),
                            item.<description>.Value
            dgv.DataSource = items.ToArray()
        End Sub
    End Class
    
    
    こちらは、Web ページからスクレイピングする場合。
    
    Imports Microsoft.Web.WebView2.Core
    Imports Microsoft.Web.WebView2.WinForms
    Public Class Form1
        Private WithEvents wv As WebView2
        Private WithEvents ds As DataSet
        Private WithEvents tbl As DataTable
        Private WithEvents dgv As DataGridView
    
        Private Async Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            ds = New DataSet()
            tbl = ds.Tables.Add("dobon")
            wv = New WebView2 With {.Visible = False}
            dgv = New DataGridView() With {.Dock = DockStyle.Fill, .ReadOnly = True, .AllowUserToAddRows = False}
            dgv.DataSource = tbl
    
            tbl.PrimaryKey = New DataColumn() {tbl.Columns.Add("Id", GetType(Integer))}
            tbl.Columns.Add("Solved", GetType(Boolean)).DefaultValue = False
            tbl.Columns.Add("Title")
            tbl.Columns.Add("Category")
            tbl.Columns.Add("FirstAuthor")
            tbl.Columns.Add("FirstPostAt")
            tbl.Columns.Add("LastAuthor")
            tbl.Columns.Add("LastPostAt")
            Controls.AddRange(New Control() {dgv, wv})
    
            Await wv.EnsureCoreWebView2Async()
            'wv.CoreWebView2.Navigate("https://dobon.net/cgi-bin/vbbbs/rss.cgi?ver=2.0")
            wv.CoreWebView2.Navigate("https://dobon.net/cgi-bin/vbbbs/cbbs.cgi?H=F&no=0")
        End Sub
        Private Async Sub wv_NavigationCompleted(sender As Object, e As CoreWebView2NavigationCompletedEventArgs) Handles wv.NavigationCompleted
            Dim js = "(()=>{
                const table=[];
                document.querySelectorAll('TABLE.topiclist').forEach(t=>{
                    [...t.rows].slice(1).forEach(tr=>{
                        const cols=[...tr.cells];
                        const d=[];
                        d[0]=cols[1].querySelector('small>font').innerText.substr(1)*1;
                        d[1]=cols[6].innerText.includes('済');
                        d[2]=cols[1].firstChild.innerText;
                        d[3]=cols[0].innerText;
                        d[4]=cols[3].innerText;
                        d[5]=cols[1].querySelector('small').lastChild.substringData(5,16);
                        d[6]=cols[4].innerText
                        d[7]=cols[5].innerText;
                        table.push(d);
                    });
                });
                return table;
            })();"
    
            Dim result = Await wv.CoreWebView2.ExecuteScriptAsync(js)
            Dim ary = Newtonsoft.Json.JsonConvert.DeserializeObject(Of Object()())(result)
            ds.EnforceConstraints = False
            Array.ForEach(ary, AddressOf tbl.Rows.Add)
            ds.EnforceConstraints = True
        End Sub
    End Class

違反を報告
引用返信
■35539 / ResNo.4)  Re[3]: WebView2によるスクレ―ピング
□投稿者/ Wan 付き人(83回)-(2023/11/12(Sun) 10:51:31)
  • アイコンHongliang様
    いつも、丁寧なご指導ありがとうございます。

    ご指摘のように、
    retrn hyou → hyouにしたら返り値が取れました。

    教えて頂いた内容を熟読して、取得した返り値を加工していきたいと思います。

    ありがとうございました。
解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-4]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35461 / 親記事)  C#でJpeg圧縮のTiffファイルを作成したい
□投稿者/ たろう 一般人(1回)-(2023/06/26(Mon) 10:58:52)
  • アイコン環境/言語:[Windows10 / C# / VisualStudio2015 / .Net Framework4.0] 
    分類:[.NET] 

    過去、Visual Studio 2015を使って、Tiffファイルを作成するアプリケーションを作成しました。

    最近になって「LEADTOOLSではJpeg圧縮のTiffファイルが作れるのに、あなたのソフトではできないのか?」といった問い合わせをもらいました。
    どうやらTiffでイメージ保存をしたいが、カラー画像だとサイズが大きいので画像はJpegにしたい(でもファイル形式はTiffのまま)ということのようです。

    私が作成した保存処理はTiffBitmapEncoderを使用しており、Compressionプロパティにセットできるものを調べるとJpegはありませんでした。

    有料のライブラリなどを使用せず、Jpeg圧縮のTiffファイルを保存する方法はないものでしょうか。
    (LEADTOOLSはライセンス料が高額なため使用したくない、という理由で.Netの機能を使用して画像保存を作成した経緯があります)

違反を報告
引用返信

▽[全レス4件(ResNo.1-4 表示)]
■35462 / ResNo.1)  Re[1]: C#でJpeg圧縮のTiffファイルを作成したい
□投稿者/ Hongliang 大御所(643回)-(2023/06/26(Mon) 12:48:38)
  • アイコンとりあえず、Windows 10 22H2では、 TiffBitmapEncoderを使っては無理みたいですね。
    // System.Windows.Media.Imaging.TiffCompressOptionには未定義の7というのも指定可能でしたが、これもLZWベースのようです。
    System.Drawingの方でも有効そうなものは見つからないので、少なくとも現時点では、恐らく.NET標準ライブラリでは扱えないでしょう。

    // System.Windows.Media.ImagingにせよSystem.DrawingにせよOSの機能をそのまま呼び出しているだけなので、そのうちWindowsのTIFFエンコーダがサポートするようになる可能性はゼロではないですが、期待薄と思います。

    どうしてもというなら、何らかのサードパーティ製ライブラリを使用するしかないでしょうね。
    NugetにはいくつかTIFFのライブラリがあるようです。ライセンスを確認の上で試されてみてはいかがでしょうか。
違反を報告
引用返信
■35463 / ResNo.2)  Re[2]: C#でJpeg圧縮のTiffファイルを作成したい
□投稿者/ たろう 一般人(2回)-(2023/06/26(Mon) 16:47:50)
  • アイコンNo35462に返信(Hongliangさんの記事)

    > どうしてもというなら、何らかのサードパーティ製ライブラリを使用するしかないでしょうね。
    > NugetにはいくつかTIFFのライブラリがあるようです。ライセンスを確認の上で試されてみてはいかがでしょうか。

    なるほど、やはり現在の.Netの標準ライブラリでは無理そうですね。
    商用利用もできて、安価もしくは無料で利用できるライブラリがないか探してみます。


違反を報告
引用返信
■35464 / ResNo.3)  Re[3]: C#でJpeg圧縮のTiffファイルを作成したい
□投稿者/ KOZ 一般人(20回)-(2023/06/27(Tue) 09:33:53)
  • アイコン
    2023/06/27(Tue) 09:36:20 編集(投稿者)
    
    ■No35463に返信(たろうさんの記事)
    
    Magick.NET でイケるようです。(ライセンスは Apache License 2.0)
    NuGet から Magick.NET.Core と Magick.NET-Q16-AnyCPU をインストールしてください。
    
    using ImageMagick;
    static class Program
    {
        [STAThread]
        static void Main() {
            using (MagickImage image = new MagickImage(@"z:\temp\test.png")) {
                image.Format = MagickFormat.Tiff;
                image.Settings.Compression = CompressionMethod.JPEG;
                image.Write(@"z:\temp\test.tif");
            }
        }
    }
    

違反を報告
引用返信
■35465 / ResNo.4)  Re[4]: C#でJpeg圧縮のTiffファイルを作成したい
□投稿者/ たろう 一般人(3回)-(2023/06/27(Tue) 15:47:44)
  • アイコンNo35464に返信(KOZさんの記事)
    > Magick.NET でイケるようです。(ライセンスは Apache License 2.0)


    情報ありがとうございます!
    試してみます。


解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-4]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35451 / 親記事)  DataGridViewのVirtualModeを有効した場合の実装方法
□投稿者/ 炎の妖精さん 一般人(27回)-(2023/06/12(Mon) 13:30:32)
  • アイコン環境/言語:[Win10/VB.NET/Framework3.5/VS2010] 
    分類:[.NET] 

    お世話になり、いつも助けていただき感謝です。
    此度の件もお付き合いいただければ恐縮です。

    DataGridViewに約50〜1000万件のデータを表示させたいと考えており、
    DataTableに膨大なデータを挿入して、DataGridViewのDataSourceを設定すると"system.outofmemoryexception"のエラーが発生します。
    ネットで調べると仮想モード(VirtualMode)を有効にするとメモリ使用量を抑えることが出来るとの記載があった為、試しに実装しました。
    ●技術レポート「DataGridViewコントロールのVirtualMode(仮想モード)について」
    https://www.softech.co.jp/mm_200506_tr.htm

    今回はデータを表示させたいだけであり、新規行や削除、値の変更は全くありませんので"DataGridView.CellValueNeeded"のみの実装で良いかなと思いましたので
    実装したのですが、状況は変わらずメモリ不足のエラーが発生しました。

    どのように実装すればメモリ消費を抑えるコードが書けるのでしょうか?
    恐縮ですが、何卒よろしくお願いいたします。
違反を報告
引用返信

▽[全レス4件(ResNo.1-4 表示)]
■35453 / ResNo.1)  Re[1]: DataGridViewのVirtualModeを有効した場合の実装方法
□投稿者/ 魔界の仮面弁士 大御所(1553回)-(2023/06/12(Mon) 16:00:50)
  • アイコン
    No35451に返信(炎の妖精さんさんの記事)
    > DataGridViewに約50〜1000万件のデータを表示させたいと考えており、
    仮に 1 レコード当たり 32 バイト程度のデータであったとしても、
    1000万レコードあったら、300MB 級のデータサイズになりますね。

    これらが Web Service として通信される場合、JSON や XML 化のために
    さらに数倍のデータ量が要求されることになるかもしれません。


    > ネットで調べると仮想モード(VirtualMode)を有効にするとメモリ使用量を抑えることが出来るとの記載があった為、試しに実装しました。
    どのように実装しましたか。
    実際に試せるような実験コードが提示されていないので、
    以下、概要のみの回答となりますが:


    > DataTableに膨大なデータを挿入して、DataGridViewのDataSourceを設定すると"system.outofmemoryexception"のエラーが発生します。
    DataGridView の仮想モードであれ、ListView の仮想モードであれ、
    そもそも 1000万件のデータを画面に表示して、そのすべてをスクロールして
    その 1件 1件をすべて閲覧するという事は非常に稀であり、
    実際に必要なデータはごく一部だけであろうかと思います。

    なので仮想モードにおいては、「現在見えているページ」、「スクロールで要求されたページ」のための
    必要最小限の小さなデータを、必要に応じてサーバーから動的に読み込むという実装をとります。
    Google Map で地図をスクロールするたびに Web 通信が行われる状況に似ていますね。

    一度読み込んだデータでも、別の領域をロードしたらまた忘れられてしまうので、
    以前の情報をとっておきたい場合は、独自のキャッシュ処理を追加します。
    (いずれにしても、大量データを保持し過ぎることが無いような設計が求められます)
    https://learn.microsoft.com/ja-jp/dotnet/desktop/winforms/controls/virtual-mode-with-just-in-time-data-loading-in-the-datagrid?view=netframeworkdesktop-4.8
違反を報告
引用返信
■35454 / ResNo.2)  Re[2]: DataGridViewのVirtualModeを有効した場合の実装方法
□投稿者/ 魔界の仮面弁士 大御所(1554回)-(2023/06/12(Mon) 16:11:32)
  • アイコンNo35453に追記(魔界の仮面弁士の記事)
    > (いずれにしても、大量データを保持し過ぎることが無いような設計が求められます)
    > https://learn.microsoft.com/ja-jp/dotnet/desktop/winforms/controls/virtual-mode-with-just-in-time-data-loading-in-the-datagrid?view=netframeworkdesktop-4.8


    上記サンプルの場合、表示領域に合わせて、

    Select Top 【rowsPerPage】列1, 列2, 列3, …
    From テーブル名
    Where ソート条件列 NOT IN
    (
     Select Top 【lowerPageBoundary】 ソート条件列
     From テーブル名
     Order By ソート条件列
    )
    Order By ソート条件列

    という SQL Server への問い合わせが行われる想定ですね。
違反を報告
引用返信
■35455 / ResNo.3)  Re[3]: DataGridViewのVirtualModeを有効した場合の実装方法
□投稿者/ 魔界の仮面弁士 大御所(1555回)-(2023/06/12(Mon) 19:00:19)
  • アイコンNo35454に追記(魔界の仮面弁士の記事)
    > 上記サンプルの場合、表示領域に合わせて、
    > という SQL Server への問い合わせが行われる想定ですね。

    SQL Server 2012 以降や Oracle12c以降であれば、
    ORDER BY 句 で OFFSET と FETCH を使うことでページングできます。
    https://sql55.com/query/paging-query-results.php

    ページ指定での分割読取り手法は、お使いのデータベースによって
    使用可能な構文も異なるでしょうし、そこは随時調整してください。
違反を報告
引用返信
■35457 / ResNo.4)  Re[4]: DataGridViewのVirtualModeを有効した場合の実装方法
□投稿者/ 炎の妖精さん 一般人(28回)-(2023/06/13(Tue) 11:18:22)
  • アイコン魔界の仮面弁士様
    いつも助けていただきまして、ありがとうございます。

    > ■No35454に追記(魔界の仮面弁士の記事)
    >> 上記サンプルの場合、表示領域に合わせて、
    >> という SQL Server への問い合わせが行われる想定ですね。
    >
    > SQL Server 2012 以降や Oracle12c以降であれば、
    > ORDER BY 句 で OFFSET と FETCH を使うことでページングできます。
    > https://sql55.com/query/paging-query-results.php
    >
    > ページ指定での分割読取り手法は、お使いのデータベースによって
    > 使用可能な構文も異なるでしょうし、そこは随時調整してください。

    イメージとしましてはECサイトの検索画面のような感じでしょうか?
    1ページで20,30件を表示させ、ページ送りが出来るようなイメージです。

    その手法をとるなら、やりたいことが実現できるかも知れません。
    一度、検討させていただきます。

解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-4]



■記事リスト / ▲上のスレッド
■35411 / 親記事)  テーブルを順番通りに直すプログラムを外部で読み込めるようにしたいです。
□投稿者/ えっぴ〜 一般人(3回)-(2023/05/10(Wed) 18:37:42)
  • アイコン環境/言語:[javascript] 
    分類:[その他] 

    テーブルを順番通りに直すプログラムを外部で読み込めるようにしたいです。
    //本文
    <table id="sort_table">
    <tr>
    <th>No</th>
    <th>全角項目</th>
    <th>数値項目</th>
    <th>カンマ</th>
    </tr>
    <tr><td>1</td><td>かきくけこ</td><td>1</td><td>1,000</td></tr>
    <tr><td>2</td><td>さしすせそ</td><td>10</td><td>10,000</td></tr>
    <tr><td>3</td><td>あいうえお</td><td>100</td><td>2,000</td></tr>
    <tr><td>4</td><td>カキクケコ</td><td>2001</td><td>3,000</td></tr>
    <tr><td>5</td><td>アイウエオ</td><td>2002</td><td>20,000</td></tr>
    <tr><td>6</td><td>サシスセソ</td><td>2003</td><td>11,000</td></tr>
    <tr><td>7</td><td>一丁目</td><td>1.234</td><td>12,000</td></tr>
    <tr><td>8</td><td>二丁目</td><td>12.34</td><td>30,000</td></tr>
    <tr><td>9</td><td>三丁目</td><td>123.4</td><td>31,000</td></tr>
    <tr><td>10</td><td>1丁目</td><td>0.001</td><td>32,000</td></tr>
    <tr><td>11</td><td>2丁目</td><td>0.002</td><td>400,000</td></tr>
    <tr><td>12</td><td>3丁目</td><td>0.003</td><td>50</td></tr>
    </table>

    <style>
    #sort_table {
    border-collapse:collapse;
    }
    #sort_table td {
    border:1px solid lightgray;
    }
    #sort_table th {
    cursor:pointer;
    background-color:lightgray;
    }
    </style>
    //javascript
    <script>
    window.addEventListener('load', function () {
    let column_no = 0; //今回クリックされた列番号
    let column_no_prev = 0; //前回クリックされた列番号
    document.querySelectorAll('#sort_table th').forEach(elm => {
    elm.onclick = function () {
    column_no = this.cellIndex; //クリックされた列番号
    let table = this.parentNode.parentNode.parentNode;
    let sortType = 0; //0:数値 1:文字
    let sortArray = new Array; //クリックした列のデータを全て格納する配列
    for (let r = 1; r < table.rows.length; r++) {
    //行番号と値を配列に格納
    let column = new Object;
    column.row = table.rows[r];
    column.value = table.rows[r].cells[column_no].textContent;
    sortArray.push(column);
    //数値判定
    if (isNaN(Number(column.value))) {
    sortType = 1; //値が数値変換できなかった場合は文字列ソート
    }
    }
    if (sortType == 0) { //数値ソート
    if (column_no_prev == column_no) { //同じ列が2回クリックされた場合は降順ソート
    sortArray.sort(compareNumberDesc);
    } else {
    sortArray.sort(compareNumber);
    }
    } else { //文字列ソート
    if (column_no_prev == column_no) { //同じ列が2回クリックされた場合は降順ソート
    sortArray.sort(compareStringDesc);
    } else {
    sortArray.sort(compareString);
    }
    }
    //ソート後のTRオブジェクトを順番にtbodyへ追加(移動)
    let tbody = this.parentNode.parentNode;
    for (let i = 0; i < sortArray.length; i++) {
    tbody.appendChild(sortArray[i].row);
    }
    //昇順/降順ソート切り替えのために列番号を保存
    if (column_no_prev == column_no) {
    column_no_prev = -1; //降順ソート
    } else {
    column_no_prev = column_no;
    }
    };
    });
    });
    //数値ソート(昇順)
    function compareNumber(a, b)
    {
    return a.value - b.value;
    }
    //数値ソート(降順)
    function compareNumberDesc(a, b)
    {
    return b.value - a.value;
    }
    //文字列ソート(昇順)
    function compareString(a, b) {
    if (a.value < b.value) {
    return -1;
    } else {
    return 1;
    }
    return 0;
    }
    //文字列ソート(降順)
    function compareStringDesc(a, b) {
    if (a.value > b.value) {
    return -1;
    } else {
    return 1;
    }
    return 0;
    }
    </script>
    let、var、constはfunctionの中で使うと、ローカル変数となってしまいます。
    グローバル変数にするにはどのようにしたらよいのでしょうか。
    しかし、let table、let tbodyに対応する関数がございません。
    もう八方塞がりです。
    jsの部分のみご記述ください。
違反を報告
引用返信

▽[全レス4件(ResNo.1-4 表示)]
■35412 / ResNo.1)  Re[1]: テーブルを順番通りに直すプログラムを外部で読み込めるようにしたいです。
□投稿者/ 魔界の仮面弁士 大御所(1543回)-(2023/05/10(Wed) 20:51:16)
  • アイコン
    No35411に返信(えっぴ〜さんの記事)
    > テーブルを順番通りに直すプログラムを外部で読み込めるようにしたいです。
    質問の意図を理解しきれていないのですが、処理を外部から呼びたいなら、
    その処理を Global スコープの function として用意すれば良いのでは?
    https://developer.mozilla.org/ja/docs/Glossary/Global_object

    現行の実装のままソートを呼び出したいということなら
    document.getElementById('sort_table').tBodies[0].rows[0].cells[3].click();
    などを呼び出すという手があります。

    変数 column_no や column_no_prev の値を読み取りたいという話なら
    それらの変数をイベントリスナーの外側で宣言するなどすればよいわけで。


    > </style>
    > //javascript
    > <script>

    <!-- javascript -->
    にしなくて良いのですか?


    > //文字列ソート(昇順)
    > function compareString(a, b) {
    > //文字列ソート(降順)
    > function compareStringDesc(a, b) {
    このいずれも、実装が明らかにおかしいような…。
    このケースだと、return 0 には絶対に到達しませんよね?
    +1 , 0 , -1 の三値を返したいなら、else if を使うべきかと。

違反を報告
引用返信
■35413 / ResNo.2)  Re[2]: テーブルを順番通りに直すプログラムを外部で読み込めるようにしたいです。
□投稿者/ 書き換えようにも構文が複雑すぎて。 一般人(1回)-(2023/05/11(Thu) 07:20:13)
  • アイコンその処理を Global スコープの function として用意すれば良いのでは?→
    今のjavascriptの関数だと、書き換えようにも構文が複雑すぎて、
    https://developer.mozilla.org/ja/docs/Glossary/Global_object
    のページでは、全然理解ができません。
    後、書き換えた内容をここにご記入いただければ幸いです。
違反を報告
引用返信
■35414 / ResNo.3)  Re[3]: テーブルを順番通りに直すプログラムを外部で読み込めるようにしたいです。
□投稿者/ 書き換えようにも構文が複雑すぎて。 一般人(2回)-(2023/05/11(Thu) 08:05:27)
  • アイコンその処理を Global スコープの function として用意すれば良いのでは?→
    今のjavascriptの関数だと、書き換えようにも構文が複雑すぎて、
    https://developer.mozilla.org/ja/docs/Glossary/Global_object
    のページでは、全然理解ができません。
    後、書き換えた内容をここにご記入いただければ幸いです。
    もし、cssだけで実装可能な場合は、その旨をご教授の上、
    cssの記述全文をお書きください。
違反を報告
引用返信
■35415 / ResNo.4)  Re[4]: テーブルを順番通りに直すプログラムを外部で読み込めるようにしたいです。
□投稿者/ 無理ゲーなのがわかりました。 一般人(1回)-(2023/05/11(Thu) 12:50:51)
  • アイコン無理ゲーなのがわかりました。
解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-4]






Mode/  Pass/


- Child Tree -