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

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

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



■記事リスト / ▼下のスレッド
■35649 / 親記事)  DataGridViewのイベント中にデータを更新するとエラーが発生
□投稿者/ Pulsar 一般人(1回)-(2025/02/07(Fri) 14:46:00)
  • アイコン環境/言語:[c# .Net9.0] 
    分類:[.NET] 

    2025/02/07(Fri) 14:56:10 編集(投稿者)
    2025/02/07(Fri) 14:47:42 編集(投稿者)

    .Net9.0 c# Microsoft.Data.SqlClientを使用していますが
    DataGridViewにBindingSourceを使用してDataTableをバインドしています。
    CellContentClickイベント中にDataTableのデータを更新して
    BindingSourceのResetBindingsメソッドを実行すると
    CellContentClickイベントが終了したタイミングで
    System.NullReferenceException: 'Object reference not set to an instance of an object.'
    が発生します。

    .Net6.0 c# System.Data.SqlClientを使用していた時はエラーは発生しませんでした。
    (同じプログラムです。)

    回避策などがありましたらご教授ください。
違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■35650 / ResNo.1)  Re[1]: DataGridViewのイベント中にデータを更新するとエラーが発生
□投稿者/ 魔界の仮面弁士 大御所(1582回)-(2025/02/12(Wed) 10:15:57)
  • アイコンNo35649に返信(Pulsarさんの記事)
    > .Net9.0 c# Microsoft.Data.SqlClientを使用していますが
    .NET 9.0 ですか…。.NET 8.0 だと結果は変わりますか?

    STS である奇数バージョン(リリース後、18ヶ月間サポートされる)は、
    LTS である偶数バージョン(リリース後、36ヶ月間サポートされる)よりも
    ライフサイクルが短いため、8.0 にしてみるのも手かもしれません。
    https://dotnet.microsoft.com/ja-jp/platform/support/policy/dotnet-core


    > DataGridViewにBindingSourceを使用してDataTableをバインドしています。
    両バージョンの DataTable で WriteXml した場合、内容に差異がありますか?
    差異が無いのなら、SqlClient そのものが原因では無いのだと思います。

    その XML を ReadXml で読み取った DataTable をバインドした場合と、
    元の SqlClient から得た DataTable をバインドした場合とで
    結果に差があるかを確認してみてはいかがでしょう。


    > CellContentClickイベント中にDataTableのデータを更新して
    > BindingSourceのResetBindingsメソッドを実行すると
    > CellContentClickイベントが終了したタイミングで
    > System.NullReferenceException: 'Object reference not set to an instance of an object.'
    > が発生します。
    例外発生時に StackTrace の内容がどうなっているか、提示することはできますか?
    もしくは、「第三者が実験可能な最小限の検証用コード」を添付することは可能でしょうか。
    .NET はソースコードが公開されているため、そこから何かヒントが得られるかもしれません。

    https://source.dot.net/#System.Windows.Forms/System/Windows/Forms/Controls/DataGridView/DataGridView.cs
    https://github.com/dotnet


    また、CellContentClick の最中に BindingSource.ResetBindings() する代わりに、
    BeginInvoke などを用いて、「CellContentClick の完了後に BindingSource.ResetBindings()」されるように
    手順を変更してみるのはどうでしょうか。


    > .Net6.0 c# System.Data.SqlClientを使用していた時はエラーは発生しませんでした。

    一般的には「c#」ではなく「C#」と表記されることが多いです。
    以下、C# 関連規格書より引用:

    -----
    JIS X 3015:2008 "プログラム言語C#" [October 2008]
     「6 頭字語及び略語」
    より引用:
    > C#は,LATIN CAPITAL LETTER C (U+0043)の次に
    > NUMBER SIGN # (U+000D)を書く。
    -----
    ISO/IEC 23270:2018 "Information technology -- Programming languages -- C# (Third edition)" [December 2018]
     「4. Acronyms and abbreviations」
    および
    ECMA-334:2023 "C# language specification (7th edition)" [December 2023]
     「Introduction」
    より引用:
    > The name C# is written as the LATIN CAPITAL LETTER C (U+0043)
    > followed by the NUMBER SIGN # (U+000D).
違反を報告
引用返信
■35651 / ResNo.2)  Re[2]: DataGridViewのイベント中にデータを更新するとエラーが発生
□投稿者/ Pulsar 一般人(2回)-(2025/02/12(Wed) 15:43:35)
  • アイコンレスありがとうございます。

    本日Version 17.13.0のアップデートがあり、
    アップデート後にリビルドしたらエラーが出なくなりました。

    レスポンスの内容は勉強になりました。
    今後の対応に応用できるかと思います。

    ありがとうございました。

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

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



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35633 / 親記事)  フォントに登録されていない文字の検出
□投稿者/ Iraquser 一般人(1回)-(2024/11/14(Thu) 10:28:51)
  • アイコン環境/言語:[Win10 C#] 
    分類:[.NET] 

    Graphic.DrawStringで文字列を描画するプログラムを開発していますが、描画しようとする文字列に含まれる文字がフォントに登録されていない場合、描画は行われないようです(全てのフォント・文字を確認した訳ではありません)。DrawString実行前に描画しようとする文字列内の全文字が描画可能か確認する手段はないのでしょうか。
違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■35634 / ResNo.1)  Re[1]: フォントに登録されていない文字の検出
□投稿者/ 魔界の仮面弁士 大御所(1577回)-(2024/11/14(Thu) 16:15:13)
  • アイコンNo35633に返信(Iraquserさんの記事)
    > Graphic.DrawStringで文字列を描画するプログラムを開発していますが
     Graphics.DrawString のことでしょうか。
    GDI+ の描画命令ですね。
    同じフォントでも、WPF と GDI と GDI+ とでは描画できる文字に差が出ます。
    GDI だと代替フォントが使われたりしますし、WFP だと異体字に対応していたりとか。
    http://bbs.wankuma.com/index.cgi?mode=al2&namber=95373&KLOG=165


    > 描画しようとする文字列内の全文字が描画可能か確認する手段はないのでしょうか。
    含まれているかどうかを調べるなら、
    GlyphTypeface.CharacterToGlyphMap.ContainsKey というものがあります。
    https://keijiban.umayadia.com/ThreadDetail.aspx?ThreadId=30649
違反を報告
引用返信
■35648 / ResNo.2)  Re[2]: フォントに登録されていない文字の検出
□投稿者/ Iraquser 一般人(2回)-(2025/01/18(Sat) 08:53:52)
  • アイコンアドバイスありがとうございます。
    お礼の返信した積りになってて、忘れておりました。本当に申し訳ありません。
解決み!
違反を報告
引用返信

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



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35636 / 親記事)  GetObjectでExcelファイルを加工するとExcelファイルが壊れる
□投稿者/ suekun 一般人(1回)-(2024/12/11(Wed) 11:53:59)
  • アイコン環境/言語:[windows11/vb.net] 
    分類:[.NET] 

    お世話になっております。
    vb.netでgetobjectでExcelファイルを読込み保存するとExcelファイルが破損します。
    下記ソースになります。何か問題がありますでしょうか?

    Private Sub LIST_Clear()
    Dim wb As Excel.Workbook
    Dim sh As Excel.Worksheet
    Dim LastRow As Integer
    Try
    wb = GetObject(ListFile)
    Catch ex As Exception

    MessageBox.Show(ex.Message)

    End Try
    sh = wb.Sheets(“Sheet1”)
    LastRow = sh.Cells(sh.Rows.Count, 1).end(Excel.XlDirection.xlUp).row
    Dim tl = sh.Cells(2, 1)
    Dim br = sh.Cells(LastRow + 1, 7)
    Dim wrange = sh.Range(tl, br)
    wrange.ClearContents()
    wb.Save() ←ここでExcelブックが壊れる(シートが参照できなくなります)
    wb.Close()
    End Sub
違反を報告
引用返信

▽[全レス9件(ResNo.5-9 表示)]
■35641 / ResNo.5)  Re[4]: GetObjectでExcelファイルを加工するとExcelファイルが壊れる
□投稿者/ suekun 一般人(5回)-(2024/12/12(Thu) 07:28:30)
  • アイコン2024/12/12(Thu) 09:13:59 編集(投稿者)

    関連なのですが
    Excelファイルを開いていたら、getobjectするようにしている個所があるのですが
    下記の通りです。
    そうしないと、読み取り専用で開いてしまいます。
    これはいかがでしょうか?正常に動作しています。

    If IO.File.Exists(ListFile) = True Then
    Try
    System.IO.File.Move(ListFile, ListFile)
    Catch ex As Exception
    '移動できなかったら起動していると判定
    GoTo ExcelOpen
    End Try
    End If
    ''ファイルオープン
    wb = Appxl.Workbooks.Open(ListFile)
    GoTo ExcelOpenExit
    ExcelOpen:
    Try
    wb = GetObject(ListFile)
    Catch ex As Exception

    MessageBox.Show(ex.Message)
    End Try
    ExcelOpenExit:

違反を報告
引用返信
■35642 / ResNo.6)  Re[5]: GetObjectでExcelファイルを加工するとExcelファイルが壊れる
□投稿者/ 魔界の仮面弁士 大御所(1580回)-(2024/12/12(Thu) 16:11:45)
  • アイコンNo35641に返信(suekunさんの記事)
    > 関連なのですが
    ファイルが破損してしまっている状態だったのか
    それともブックが非表示になっていただけなのか
    確認はとれましたか?


    > そうしないと、読み取り専用で開いてしまいます。
    この判定を行う目的を教えてください。

    編集・保存することを目的としたものでしょうか。
    それとも、他で同時に開かれていないことを保証したいのでしょうか。
    目的を満たすために、GetObject 以外の手法を使うことは許容されますか?

    他で開かれていても保存までできるパターンはありますし
    他で開かれていなくても保存できないパターンもありますし、
    他で開かれていて Workbooks.Open で排他エラーになるパターンもあるので
    念のために確認しています。

    最終的に、ファイルに「読み取り専用属性が付いているか」とか
    アクセス権で「読み取りは許可されているが編集は許可されていない」などの
    パターンまでチェックするのか、何のためにどこまで調査したいのか…。

    GetObject に拘りが無ければ、ROT から Excel.Application オブジェクトを辿って、
    Excel.Application インスタンス (表示名「!{00024500-0000-0000-C000-000000000046}」)から
    それぞれの Workbooks コレクションを列挙判定するという手段もあります。
    コードとしては些か回りくどくなりますが…。
    https://alax.info/blog/1444
    http://bbs.wankuma.com/index.cgi?mode=one&namber=103471


    > これはいかがでしょうか?正常に動作しています。
    うぅむ?
    ListFile と NyukoCSVListFile の関連性が謎ですね??

    変数宣言や Visible の指定有無など、色々と省略され過ぎていて、
    是非の判断がしづらいところです。

    > wb = Appxl.Workbooks.Open(ListFile)
    この書き方は避けるべきですが、ここも掲示板投稿時に
    簡略化しているだけだと思うので、ひとまず目を瞑るとして…。


    > If IO.File.Exists(ListFile) = True Then
    >  Try
    >   System.IO.File.Move(ListFile, ListFile)
    1 行目では「System」を省略して、
    3 行目では明記するという非対称性がとても気になる…。

    Boolean 値の判定時に「= True」を書くべきか否かとか、
    GoTo の是非とか、素の Exception を Catch するべきかどうかとか、
    Message を表示するだけでどの Exception かを記録しないのか、
    そういった宗教論についてはとりあえず保留するとして。


    閑話休題

    >   '移動できなかったら起動していると判定
    この手順ですが、確実性のある手法では無いです。
    そのファイルが Excel で開かれているからといって、同名 Move が失敗する保証は無いからです。

    たとえば、扱っていたファイルが MultiUserEditing = True なものだった場合です。
    共有モードで開かれたファイルであれば、複数ユーザーが同時に開いて編集して保存できますし、
    開かれている最中でも、コマンドプロンプトからの同名 MOVE や VB からの同名 File.Move が
    エラーを発することはありません。

    もちろん、そうした前提条件が明確になっていて、それで目的を果たせる場合は
    現在の手法でも構わないと思います。
違反を報告
引用返信
■35643 / ResNo.7)  Re[6]: GetObjectでExcelファイルを加工するとExcelファイルが壊れる
□投稿者/ 魔界の仮面弁士 大御所(1581回)-(2024/12/12(Thu) 16:23:59)
  • アイコンNo35642に追記(魔界の仮面弁士の記事)
    > ListFile と NyukoCSVListFile の関連性が謎ですね??

    この一文は無視してください。
    元質問が編集される前に書いた回答文が紛れていました。
    > > 2024/12/12(Thu) 09:13:59 編集(投稿者)

    (投稿時にパスワードミスったかな…再編集できなかった)
違反を報告
引用返信
■35644 / ResNo.8)  Re[6]: GetObjectでExcelファイルを加工するとExcelファイルが壊れる
□投稿者/ suekun 一般人(6回)-(2024/12/13(Fri) 08:56:58)
  • アイコンNo35642に返信(魔界の仮面弁士さんの記事)
    > ■No35641に返信(suekunさんの記事)
    >>関連なのですが
    > ファイルが破損してしまっている状態だったのか
    > それともブックが非表示になっていただけなのか
    > 確認はとれましたか?

    →ブックが非表示になっていたことがわかりました。
     ファイル自体は、破損していなかったようです。
     ただ、毎回同じ状態になるので、getobjectは、ファイルが開かれている場合のみにしようと考えております。
     ありがとうございます。
違反を報告
引用返信
■35645 / ResNo.9)  Re[6]: GetObjectでExcelファイルを加工するとExcelファイルが壊れる
□投稿者/ suekun 一般人(7回)-(2024/12/18(Wed) 15:31:06)
  • アイコンNo35642に返信(魔界の仮面弁士さんの記事)
    魔界の仮面弁士さん
    ありがとうございました。
    大変勉強になりました。
解決み!
違反を報告
引用返信

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



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35631 / 親記事)  oledbでdatatableを取得するときにエラーになる
□投稿者/ 末長 邦明 一般人(1回)-(2024/11/08(Fri) 14:00:33)
  • アイコン環境/言語:[windows11/vb.net] 
    分類:[.NET] 

    yahoo知恵袋にマルチポストしています。
    vb.net(VS2022)で
    oledbでdatatableを取得するときのエラーについて質問です。
    下記ソースでテストを行っていますが、
    ' データを取得する
    da.Fill(excelToDt)
    のところで、「引数が無効です」となってしまいます。
    debugモードでは、正常に動作します。
    どのように対応すればよろしいでしょうか?
    よろしくお願い申し上げます。

    Public Function excelToDt(ByVal p_fileNm As String, Optional ByVal p_sheetNm As String = "Sheet1") As DataTable

    Dim con As New OleDbConnection()
    Dim cmd As New OleDbCommand()
    Dim da As New OleDbDataAdapter()
    Dim FileName As String = Path.GetFileName(p_fileNm)
    Try

    excelToDt = New System.Data.DataTable()

    con.ConnectionString =
    "Provider=Microsoft.ACE.OLEDB.12.0; " &
    "Data Source=" & p_fileNm & ";" & "Extended Properties=""Excel 12.0;HDR=YES;"""
    ' コネクションの設定
    cmd.Connection = con

    ' SQL文の設定
    cmd.CommandText = "SELECT * FROM [" & p_sheetNm & "$] "

    ' SELECTコマンドの設定
    da.SelectCommand = cmd

    ' データを取得する
    da.Fill(excelToDt)

    Catch ex As Exception
    Throw
    Finally
    con.Dispose()
    cmd.Dispose()
    da.Dispose()
    End Try

    End Function
    ----------------------------------------
    internal OleDbConnectionInternal(OleDbConnectionString constr, OleDbConnection connection)
    {
    ConnectionString = constr;
    if (constr.PossiblePrompt && !Environment.UserInteractive)
    {
    throw ODB.PossiblePromptNotUserInteractive();
    }
    try
    {
    OleDbServicesWrapper objectPool = GetObjectPool();
    _datasrcwrp = new DataSourceWrapper();
    objectPool.GetDataSource(constr, ref _datasrcwrp);
    if (connection != null)
    {
    _sessionwrp = new SessionWrapper();
    OleDbHResult oleDbHResult = _datasrcwrp.InitializeAndCreateSession(constr, ref _sessionwrp);
    if (OleDbHResult.S_OK > oleDbHResult || _sessionwrp.IsInvalid)
    {
    Exception ex = OleDbConnection.ProcessResults(oleDbHResult, null, null);
    throw ex;
    }
    OleDbConnection.ProcessResults(oleDbHResult, connection, connection);
    }
    }
    catch
    {
    if (_sessionwrp != null)
    {
    _sessionwrp.Dispose();
    _sessionwrp = null;
    }
    if (_datasrcwrp != null)
    {
    _datasrcwrp.Dispose();
    _datasrcwrp = null;
    }
    throw; ←ここでエラーになります
    }
    }

違反を報告
引用返信

▽[全レス1件(ResNo.1-1 表示)]
■35632 / ResNo.1)  Re[1]: oledbでdatatableを取得するときにエラーになる
□投稿者/ 末長 邦明 一般人(2回)-(2024/11/08(Fri) 15:16:23)
  • アイコンありがとうございます。
    マクロファイル(.xlsm)を開こうとしてエラーになっていました。
    通常のExcelファイル(.xlsx)に変更したところ、releaseモードでも正常に動作しました。

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

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



■記事リスト / ▲上のスレッド
■35281 / 親記事)  作成した白黒画像をWordに貼り付けてから「図として保存」
□投稿者/ x-boy 一般人(1回)-(2022/12/15(Thu) 17:43:42)
  • アイコン環境/言語:[VB2013〜2019] 
    分類:[.NET] 

    開発環境:VB2013〜2019

    こんにちは。
    以下の.NET Tipsを参考に、白黒の画像(二値化)を作成しました。

    2値化して、1bppの白黒画像を作成する
     https://dobon.net/vb/dotnet/graphics/1bpp.html

    PixelFormatはFormat1bppIndexedで、画像ファイルはPng形式で保存しました。
    このファイルのプロパティを見ると、ビットの深さは1になっていて、
    思い通りの白黒画像が出来ました。

    ただ、この画像ファイルをWord2019でWord本文に挿入し、これを
    Wordの右クリックメニュー「図として保存」でpng形式で保存した時、
    保存した画像ファイルをペイントで開くと、色が変になっています。
    具体的には白の部分が何だかグレーっぽい色、黒の部分が透過色になっていました。

    これは画像データの作成方法に問題があるのでしょうか?
    それとも、Word側で1bpp画像をうまく扱えないのでしょうか?
    またはペイントの問題でしょうか?

    ちなみに、「図として保存」でgifやbmp形式を選択して保存するとすれば
    ペイントでも思い通りの白黒になりました。
    (ただしgifは8ビット、bmpは24ビット画像になってしまいました。)

    また、対象のWordファイルを保存して拡張子を.docx→.zipに書き換えて
    このzipファイルの中身を確認すると、Wordに貼り付けた画像がありましたが、
    この画像はきれいな白黒の1bpp画像でした。
違反を報告
引用返信

▽[全レス8件(ResNo.4-8 表示)]
■35286 / ResNo.4)  Re[4]: 作成した白黒画像をWordに貼り付けてから「図として保存」
□投稿者/ x-boy 一般人(2回)-(2022/12/16(Fri) 11:28:15)
  • アイコン皆様、ありがとうございます。
    色々調べると、Wordの「図として保存」は色々と問題があるようで、
    Word側の問題なのかも知れません。

    とりあえずは、別の1bpp形式の画像を作って試してみたいと思いますが、
    System.Drawing.BitmapのSaveでは、gif形式(ImageFormat.Gif)を指定すると
    8ビット画像になってしまうようです。

    System.Drawing.Bitmapクラスを使う以外の方法で1bpp形式の画像を生成するには
    どうすればよいでしょうか?
違反を報告
引用返信
■35287 / ResNo.5)  Re[5]: 作成した白黒画像をWordに貼り付けてから「図として保存」
□投稿者/ 魔界の仮面弁士 大御所(1503回)-(2022/12/16(Fri) 11:51:46)
  • アイコン2022/12/16(Fri) 16:50:52 編集(投稿者)

    No35281に返信(x-boyさんの記事)
    > 以下の.NET Tipsを参考に、白黒の画像(二値化)を作成しました。
    > https://dobon.net/vb/dotnet/graphics/1bpp.html

    ImageCodecInfo + EncoderParameters を指定可能な
    Save メソッドのオーバーロードを指定しても、
    Png フォーマットの細かいパラメーターは指定できないらしいです。(ただし当方未検証)
    https://social.msdn.microsoft.com/Forums/ja-JP/cbae4e4d-be5f-4a8d-a476-cf3dee6c4a49/c45png?forum=netfxgeneralja


    ということで、ImageFormat を指定する方の Save を読んで保存していますが、
    こちらで検証してみても、どうにも Word 側に問題があるっぽい感じがしますね。

    'img0.png はこれです → https://dobon.net/s/img/logo-bt1-108x24.png
    Using src As New Bitmap("E:\img0.png") _
      , dst = Create1bppImage(src)
      dst.Save("E:\img1.png", ImageFormat.Png)
      dst.Save("E:\img2.bmp", ImageFormat.Bmp)
    End Using


    (0) img0.png … 155 バイト Chunk=[IHDR, PLTE, tRNS, IDAT, IEND]
    (1) img1.png … 193 バイト Chunk=[IHDR, sRGB, gAMA, PLTE, pHYs, IDAT, IEND]
    (2) img2.bmp … 446 バイト

    --> 上記を AzConvPNG で圧縮したもの -->
    (3) img3.png … 148 バイト Chunk=[IHDR, PLTE, tRNS, IDAT, IEND]
    (4) img4.png … 135 バイト Chunk=[IHDR, PLTE, IDAT, IEND]
    (5) img5.png … 135 バイト Chunk=[IHDR, PLTE, IDAT, IEND]

    --> それらを Word に貼って「図として保存」したもの -->
    (6) img0_wd.png … 207 バイト 正常画 Chunk=[IHDR, sRGB, gAMA, PLTE, tRNS, pHYs, IDAT, IEND]
    (7) img1_wd.png … 153 バイト 色化け Chunk=[IHDR, sRGB, gAMA, PLTE, tRNS, pHYs, IDAT, IEND]
    (8) img2_wd.png … 153 バイト 色化け Chunk=[IHDR, sRGB, gAMA, PLTE, tRNS, pHYs, IDAT, IEND]
    (9) img3_wd.png … 207 バイト 正常画 Chunk=[IHDR, sRGB, gAMA, PLTE, tRNS, pHYs, IDAT, IEND]
    (10)img4_wd.png … 153 バイト 色化け Chunk=[IHDR, sRGB, gAMA, PLTE, tRNS, pHYs, IDAT, IEND]
    (11)img5_wd.png … 153 バイト 色化け Chunk=[IHDR, sRGB, gAMA, PLTE, tRNS, pHYs, IDAT, IEND]


    正常だった (6) と、化けてしまった (7) を比較してみると、
    ヘッダー, IHDR, sRGB, gAMA, tRNS, pHYs, IEND は同一ですが、
    PLTE(パレット情報) と IDAT(イメージデータ) が変質していました。
違反を報告
引用返信
■35288 / ResNo.6)  Re[6]: 作成した白黒画像をWordに貼り付けてから「図として保存」
□投稿者/ x-boy 一般人(1回)-(2022/12/16(Fri) 14:29:48)
  • アイコン2022/12/16(Fri) 14:33:22 編集(投稿者)

    魔界の仮面弁士様、ありがとうございます。
    ちなみに、

    > (0) img0.png … 155 バイト Chunk=[IHDR, PLTE, tRNS, IDAT, IEND]
    > (1) img1.png … 193 バイト Chunk=[IHDR, sRGB, gAMA, PLTE, pHYs, IDAT, IEND]

    の「Chunk=〜」は、Pngファイルのヘッダ情報でしょうか?

    これを見ると、シロートながら、#Chunk=[IHDR, PLTE, tRNS, IDAT, IEND]になっているものが色化けしていないように見えますが、さっぱり分かりません。
    (sRGBがRGB、gAMAがガンマ値かな、っていう感じですが、良く分かっていません)

    せっかくの機会ですので、ここら辺を勉強したいので、なにか解説サイトがあれば教えて頂けるとありがたいです。


違反を報告
引用返信
■35290 / ResNo.7)  Re[7]: 作成した白黒画像をWordに貼り付けてから「図として保存」
□投稿者/ 魔界の仮面弁士 大御所(1504回)-(2022/12/16(Fri) 16:39:13)
  • アイコンNo35288に返信( x-boyさんの記事)
    > の「Chunk=〜」は、Pngファイルのヘッダ情報でしょうか?

    PNG ヘッダーの後に続く構造体のことです。

    すべてのチャンクは、4 文字の case-sensitive な識別子(type)を持ち、
    それぞれ下記の構造になっています。

     ・4 バイト: "length" (チャンクの data 部のバイト数)
     ・4 バイト: "type" (4 文字でチャンクの種類を表す)
     ・可変長: "data" (チャンクのデータ本体)
     ・4 バイト: "CRC-32" (type と data の誤り検出符号)

    より詳しいレイアウトは、 No35284 で紹介したサイトをご覧ください。
    https://www.setsuki.com/hsp/ext/png.htm


    > これを見ると、シロートながら、#Chunk=[IHDR, PLTE, tRNS, IDAT, IEND]になっているものが色化けしていないように見えますが、さっぱり分かりません。
    こちらに投げてみるとわかりやすいかも。
    https://www.nayuki.io/page/png-file-chunk-inspector


    > (sRGBがRGB、gAMAがガンマ値かな、っていう感じですが、良く分かっていません)
    tRNS チャンクは 0 個 or 1 個存在し、透明度情報を保持しています。
    チャンクデータは可変長で、その構造は IHDR のカラータイプによって異なります。

    gAMA チャンクは 0 個 or 1 個存在し、内包する RGB データのリニア輝度からの
    ガンマ補正値を 4 バイトの値で保持しています。
    https://qiita.com/yoya/items/ce8dffc8a8a19746d87c

    sRGB チャンクは 0 個 or 1 個存在し、画像色が「sRGB 色空間」であることを示します。
    https://www.setsuki.com/hsp/ext/chunk/sRGB.htm
違反を報告
引用返信
■35291 / ResNo.8)  Re[8]: 作成した白黒画像をWordに貼り付けてから「図として保存」
□投稿者/ x-boy 一般人(2回)-(2022/12/16(Fri) 16:49:58)
  • アイコン魔界の仮面弁士様、ありがとうございます。
    ご教示頂いた情報を元に、自分なりに勉強してみます。

違反を報告
引用返信

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






Mode/  Pass/


- Child Tree -

2025/02/17(Mon) 13:35:38 に作成されたキャッシュを表示しています。
生のデータを表示する | キャッシュを最新にする