[[20191212155543]] 『VBAでpng画像ファイルを出力するとき色深度を24bi』(ジョニー) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『VBAでpng画像ファイルを出力するとき色深度を24bitにしたい』(ジョニー)

エクセルに挿入した色深度24bitの画像データをグラフに張り付けて
pngファイルとして出力したく、
以下のコードを参考に利用させていただき、
画像ファイルが出力されるところまではできたのですが
色深度が32bitに変換されてしまいます。
24bitのまま出力するまたは24bitに変換するには
どのようにしたらよいでしょうか?

Dim myChart As ChartObject
For Each tobj In ActiveSheet.Shapes

 If tobj.Type = 13 Then 'オブジェクトが画像ならType=13
 tobj.CopyPicture
 Fname = tobj.Name 'オブジェクトの名前を取得
 ACWidth = tobj.Width 'オブジェクトのサイズを取得(高さ)
 ACHeight = tobj.Height 'オブジェクトのサイズを取得(高さ)
 'オブジェクトとほぼ同サイズの空のグラフを一時的に作る
 Set TCht = ActiveSheet.ChartObjects.Add(0, 0, ACWidth * 1, ACHeight * 1).Chart
 For Each myChart In ActiveSheet.ChartObjects
        'myChart.Chart.ChartArea.Border.Color = RGB(0, 0, 0) 'グラフの枠線を消す
        myChart.Chart.ChartArea.Format.Line.Visible = msoFalse
        myChart.Chart.ChartArea.Interior.Color = RGB(0, 0, 0) 'グラフの背景を黒にする
        myChart.Select
        TCht.Paste
    Next
  'グラフに画像をペーストする。
 'エクスポート先はデスクトップ。ファイル名はオブジェクト名。タイプはpng(書き換えればjpeg等でもいける。)
 TCht.Export Filename:="C:\tmp|\ & Fname & ".png", filtername:="png"
 TCht.Parent.Delete 'グラフを削除する。
End If
 Next

< 使用 Excel:Excel2013、使用 OS:Windows10 >


色数設定はパラメータに無いので、Excel任せになります。 32bitカラーといっても、PNGは透明度表現のために8bit付加しただけであり、色数は24bitカラーと同じですよ? 特に問題が無さそうですが、何故24bit化したいのでしょう?

それに、そもそもExcelは表計算アプリでしかなく、PNG形式で出力できるだけでよくやっていると思います。 どうしても変えたいならば、もしかするとディスプレイ設定を変えると連動して変わるかもしれませんが、最悪はPNGフォーマットに準じて、自分でグラフィックツールのようにバイナリで保存する事になるでしょう。 不可能ではないですが、VBAでは遅いだろうし、開発は大変だと思いますよ。
(???) 2019/12/12(木) 16:38


返信ありがとうございます。
畳み込みニューラルネットワーク用の学習画像データを一度に大量に生成させるために
利用したく、VBAしかうまく扱えないので試みたしだいです。
24bitが必要なのは、既に構築されたニューラルネットワークのinputレイヤーが
RGBの3チャンネルしかなく、透明度表現のための8bit分があるとエラーを返してしまうためでした。
おっしゃられているように色数設定パラメータがなくVBAでは難しいとは思いましたが
やはり難しそうですね。ありがとうございました。

(ジョニー) 2019/12/13(金) 11:01


GDI++を使うので難しいですが、関数化した例があったので、参考にしてください。
http://gdipluscode.sakura.ne.jp/gdip/cb2jpeg.html

ここに書かれた関数を使うと、以下のようなコードで24bitのPNGにできそうです。
(メモリ上でBMP化する方法が判らなかったので、一旦BMPファイル化しています)

 Sub test()
    Const tmpFile = "c:\tmp\test.bmp"
    Dim myStdPicture As StdPicture
    Dim gdipRet As GDIPlusStatusConstants

    ActiveSheet.ChartObjects(1).Chart.Export tmpFile, "BMP"
    Set myStdPicture = LoadPicture(tmpFile)
    gdipRet = SavePicturePng(myStdPicture, "c:\tmp\test.png")
    Kill tmpFile
 End Sub
(???) 2019/12/13(金) 13:48

返信ありがとうございます!勉強いたします。

(ジョニー) 2019/12/13(金) 14:47


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.