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

bmpファイルからtgaファイルを作成

環境/言語:[vb.net]
分類:[.NET]

bmpファイルがあります。
これをαチャンネルを追加してtgaファイルにVB6のコードから
作成したいです。

参考となるHPや、方法を教えていただきたいです。


bmp上にある黒の映像を透過100%にしたいです。
この投稿はマルチポストです。

●マルチポストされている場所
http://hpcgi1.nifty.com/MADIA/VBBBS/wwwlng.cgi?print+201205/12050004.txt

----------
この掲示板ではマルチポストが禁止されています。詳しくは、「書き込みのマナーについて」をお読みください。

●書き込みのマナーについて
http://dobon.net/vb/bbs/index.html
■No30478に返信(tanakaさんの記事)
> これをαチャンネルを追加してtgaファイルにVB6のコードから
> 作成したいです。

VB6のコードから、と言いながら、
>> 環境/言語:[vb.net] 
>> 分類:[.NET]
を選択しているということは、VB7以降でも構わないということでしょうか?

TGA ファイルの生成なら、こちらは如何でしょうか。
これは .NET 用ですが、VB6 用なら 12.0 とか 14.0 とかがあったはず。
http://www.grapecity.com/tools/products/leadimagingpro165


> bmpファイルがあります。
αチャンネル付の32bitビットマップではない、ということですね。

png であれば、VB6 でも .NET でも実装可能だとは思います(GDI+ API など)。


しかし、TGA となると標準ではサポートされていないので、
サードパーティ製品なりオープンソースの変換ライブラリなり
フリーソフトなりを探してきて利用するか、または自前で
TGA のバイナリを生成してファイル化する必要があるでしょう。


TGA変換機能を持ったツールとしては、たとえば NConvert とか XnConvert とか。

Shell "C:\test\nconvert.exe -out tga -o C:\test\test1.tga C:\test\test.png"

http://ja.wikipedia.org/wiki/XnView
http://www.xnview.com/en/download_nc.html
http://www.xnconvert.com/ja
http://www.geocities.jp/xnviewja/nconvert.html
■No30481に返信(魔界の仮面弁士さんの記事)
> ■No30478に返信(tanakaさんの記事)
>>これをαチャンネルを追加してtgaファイルにVB6のコードから
>>作成したいです。

>
> png であれば、VB6 でも .NET でも実装可能だとは思います(GDI+ API など)。
>
>
> しかし、TGA となると標準ではサポートされていないので、
> サードパーティ製品なりオープンソースの変換ライブラリなり
> フリーソフトなりを探してきて利用するか、または自前で
> TGA のバイナリを生成してファイル化する必要があるでしょう。


親切な回答ありがとうございます。

用途なのですが、海外製のキャプチャーボードを仕様します。
キャプチャーボードに用意されているSDKですが、映像にBMPとTGAファイルを挿入できます。

αチャンネルを持つ24bit無圧縮ファイルであれば、透過されている画像を映像に挿入できます。

プログラムは、VB6.0で作成されています。
使いたい機能は、
@ピクチャーボックスの画像からBMPを作成します。
A作成されたBMP黒色の部分を透過100%のαチャンネルを追加したTGAファイルを作成
BTGAファイルを映像に取込む。


TGAファイルを生成したい理由です。

一番良い方法があれば、ご教示していただきたいです。

> A作成されたBMP黒色の部分を透過100%のαチャンネルを追加したTGAファイルを作成

黒色を透過させることができるツールがあれば
一番簡単なように思ったため、
下記のnconvert.exeのオプションを見てみました。

http://www.geocities.jp/xnviewja/nconvert.html

GIF/PNG形式に限定されますが、下記のオプションが利用できそうです。
-transparent
-transpcolor

BMPからGIFに変換し、GIFからTGAへ変換すればできそうですね。
がんばってください。
■No30484に返信(tanakaさんの記事)
> αチャンネルを持つ24bit無圧縮ファイルであれば
αチャンネルを持つ TGA であれば、ARGB の4色で32bitでは無いでしょうか。
(α=8bit、赤=8bit、緑=8bit、青=8bit)
http://www.openspc2.org/format/TGA/index.html
http://opengl.wiki.mface.jp/s/TGA%E7%94%BB%E5%83%8F%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF


> 一番良い方法があれば、ご教示していただきたいです。
とりあえず、先に提示した方法は 3 案あります。

有償のコンポーネント(LEADTOOLS等)でTGAファイルを作成する使う方法と、
GDI+ API で透過させたてから NConvert を Shell 関数で呼び出してTGA化する方法、
そして、TGAのバイナリを自前で生成してファイル化する方法です。

なお、GDI+ API の場合はこのあたりを使う事になると思います。
http://hanatyan.sakura.ne.jp/vb60bbs/wforum.cgi?mode=allread&no=14597&page=0


.NET であれば簡単なのですけれどね…。

Dim srcFile As String = "C:\temp\bmp24.bmp"
Dim tmpFile As String = "C:\temp\bmp32.bmp"
Dim dstFile As String = "C:\temp\result.tga"

Using bmp As New Bitmap(srcFile)
    bmp.MakeTransparent(Color.Black)                       '黒(R=0,G=0,B=0)を透過させる
    bmp.Save(tmpFile, Imaging.ImageFormat.Bmp)             'BMP(32bit)として保存
    Dim p As Process = Process.Start( _
        "C:\tools\XnView\nconvert.exe", _
        String.Format("-overwrite -out tga -o {1} {0}", _
        tmpFile, dstFile))                                 'NConvert で TGA 化
    p.WaitForExit()                                        '変換完了まで待機
    System.IO.File.Delete(tmpFile)                         '中間ファイルを削除
End Using



どういった方法が「一番良い」のかは、御自身で判断していただくしか無いのですが
個人利用の場合は、費用のかさむ有償製品案は除外されるでしょうね。
業務利用なら、開発工数よりも安価に済めば有償製品の導入もアリでしょうけれども。
(なお、NConvert は商用目的では利用できないのでご注意ください)


> 作成されたBMP黒色の部分を透過100%
もしもVB6からGDI+で特定色を透過させるのであれば、透明のキャンパスに対し
GdipSetImageAttributesColorKeys で黒を透過色指定した Attributes と共に
GdipDrawImagePointsRectI を呼び出せば良さそうです。
http://msdn.microsoft.com/en-us/library/ms534042.aspx
(.NET でいえば、ImageAttributes.SetColorKey + Graphics.DrawImage に相当)


■No30486に返信(kikuさんの記事)
> BMPからGIFに変換し、GIFからTGAへ変換すればできそうですね。
GIFはインデックスカラーであり、最大で8ビット(256色)までしか使えません。
(BMP や PNG ならば、R,G,B,A の 32bitカラーを保有させられますが)

なので nconvert の対応度がどうであれ、GIFを経由させるのであれば
元のBMPの色数もそれに準じる必要があります。
GIF経由にした場合、元のBMPの色数によっては減色処理が必要となります。

# 色数に関しては、複数フレームのアニメーションGIFを用いることで
# 疑似的にフルカラーにはできますが、今回の目的では使えないでしょうし。

なお、GIF は透明色は持てますが、半透明色は作れないという制限もあります。
今回の透明度は100%と0%の二択らしいので、この点はクリアできそうですけれどね。
■No30488に返信(魔界の仮面弁士さんの記事)
>>BMPからGIFに変換し、GIFからTGAへ変換すればできそうですね。
> GIFはインデックスカラーであり、最大で8ビット(256色)までしか使えません。
> (BMP や PNG ならば、R,G,B,A の 32bitカラーを保有させられますが)
>
> なので nconvert の対応度がどうであれ、GIFを経由させるのであれば
> 元のBMPの色数もそれに準じる必要があります。
> GIF経由にした場合、元のBMPの色数によっては減色処理が必要となります。
>
> # 色数に関しては、複数フレームのアニメーションGIFを用いることで
> # 疑似的にフルカラーにはできますが、今回の目的では使えないでしょうし。
>
> なお、GIF は透明色は持てますが、半透明色は作れないという制限もあります。
> 今回の透明度は100%と0%の二択らしいので、この点はクリアできそうですけれどね。

たいへん勉強になりました。
わざわざご指摘頂きありがとうございます。
半透明色が作れないことは知っていたのですが、
色数まで意識がまわりませんでした。

>どういった方法が「一番良い」のかは、御自身で判断していただくしか無いのですが
>個人利用の場合は、費用のかさむ有償製品案は除外されるでしょうね。
>業務利用なら、開発工数よりも安価に済めば有償製品の導入もアリでしょうけれども。
>(なお、NConvert は商用目的では利用できないのでご注意ください)

おっしゃる通りですね。
ただ今回の場合、BMPファイルもTGAファイルもすべての
形式をサポートする必要がなさそうですし、
自前でがんばって作っちゃうのも手かもしれませんね。
魔界の仮面弁士 さん
>.NET であれば簡単なのですけれどね…。

紹介していただいた、.netのコードにて、αチャンネルを追加したtgaファイルが作成でき、透明化を実現した画像のスーパーインポーズが実装できました。
ありがとうございました。
解決しました。
解決済み!

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