C#のMakeTransparent関数で画像の透明処理ができない問題

このQ&Aのポイント
  • C#において、MakeTransparent関数を用いて画像の透明処理を行おうとした際に、「'System.Drawing.Image' に 'MakeTransparent' の定義がありません。」というエラーメッセージが表示され、ビルドできない問題が発生しました。
  • 使用した制作環境はVisual Studio.NET 2003とVisualC# 2005 Express Editionですが、どちらの環境でも同じエラーが発生しています。
  • 初期の定義であるusing System.DrawingにはMakeTransparent関数の定義が存在しないため、使用することができない可能性があります。
回答を見る
  • ベストアンサー

C# MakeTransparent関数について

C#において元画像の1ピクセルを指示し,画像の透過処理を MakeTransparent関数を用いて実行しようとしたところ, 「'System.Drawing.Image' に 'MakeTransparent' の定義がありません。」 と表記されビルドすることができませんでした。 制作環境はVisual Studio.NET 2003,VisualC# 2005 Express Edition の2つを用いたのですがどちらも同じエラーでありました。 初期の定義である using System.Drawing にはMakeTransparent関数 を使用することが出来る定義は存在していないのでしょうか? 宜しければ回答をお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

MakeTransparentはSystem.Drawing.Bitmapクラスのメソッドですよ System.Drawing.Imageのメンバーではありません これは C#2005でも一緒です Bitmap bmpObj = new Bitmap( imgObj ); bmpObj.MakeTransparent( bmpObj.GetPixel( 0, 0 ) ); g.DrawImage( bmpObj, 0, 0 ); bmpObj.Dispose(); といった具合です …

satojigoku
質問者

お礼

ありがとうございます。ご指摘の通り Image bmpObj = new Bitmap(imgObj); の部分を Bitmap bmpObj = new Bitmap( imgObj ); に変換させていただいたところビルドに成功し 画像の透過処理が行えました。 ありがとうございました!

関連するQ&A

  • Visual C++ 2008 Express EditionでCのコンパイルは可能ですか?

    Visual C++ 2008 Express Editionを使いプログラムをC++で書いていたのですが、 Cで書かなくては駄目な状況になりVisual C++ 2008 Express Edition でもCのコンパイルが出来るのかを教えて貰いたいです。 試してみたところ出来そうになくて困っています。 Visual C++ 2008 Express Editionの導入方法は以下のURLの通りにしました。 http://www.microsoft.com/japan/msdn/vstudio/express/beginners/2008/visualc.aspx なにか追加で入れる事で使える様になるのか、もしくは出来ないのかよろしくお願いします。

  • Visual C++ Express Edition でもprintf

    Visual C++ Express Edition でもprintfを使いたい 私は、Visual C++ 2008 Express Editionを使っています。  以前はVisual Studio 2005 Professionalを使っていました。 今まではプログラムを走らせている間の変数の変化を見るために、 printf関数を使って「出力」ウィンドウに数値を表示させていました。 Visual C++ 2008 Express Editionに変更してから、 同一のソースコードをコンパイル、実行しても printf文で記述した出力内容を「出力」ウィンドウに表示させることができません。 これは、Express Edition特有のものでしょうか? printfを使って変数を表示できる方法があれば教えてください。 よろしくお願いします。

  • Visual Studio 2017C#

    下記のVisual Studio 2017 C# 19行目のXの定義がありません。 と出ました。 11行目で定義していると思うのですけど…。 どういうことなのか教えてください。 ご多忙のところ恐れ入りますが、ご回答のほどよろしくお願いします。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace jump25 { class Test { public int x = 10; } class Program { public static void Main(string[] args) { Test obj = new Test(); int y = object.x; Console.WriteLine(y); } } }

  • C#(Windows Form)で作る電子印鑑

    C#で電子印鑑を作っています。 前提として、私はプログラマーではありません。過去に大学の講義でCを受けており、コードの理解はできます。趣味程度でVisualStudio 2022とAIチャットを駆使して作っています。Framework 4.8.1 ChatGPTで限界を感じたので、ここで質問させていただきます。 ※ひたすらChatGPTで質問した後なので、補足がくどい場合があります。ご承知おきください。 ※質問内のコードが有効な方法かは知りません。普通はやらないコードも使ってるかもしれません。藁にも縋る思いです。すでにpng・メタファイル・ChatGPT・Geminiと格闘し続けて3週間以上です 一通りコードを書き終え、白背景で印影をAdobe ReaderのPDF(以下、単純に「PDF」と書きます)にCtrl+Vで貼り付けるところまで実装できました。BMP形式なので割とすんなりでした。もともとある画像を読み込んでいるのではなく、描画はすべてDrawLineやDrawEllipseで実施しています。 この白背景は、ラジオボタンで背景透過画像と切り替えできるようにしています。背景透過画像が肝心です。 今、実装できていないのが、この背景透過画像をPDFにCtrl+Vで貼り付ける動作です。 PDFに背景透過画像を貼り付けるコードにできますでしょうか?拡張メタファイル形式でコピーできれば貼り付けられると思うのですが… 下にも書きますが、Office系には背景透過画像の貼り付けが成功しています。 今のコードが以下です。if文内なので、usingでくくってます。ボタンクリックでクリップボードコピーです。 名前空間 using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.Drawing.Text; using System.Globalization; using System.IO; using System.Linq; using System.Security.Cryptography.X509Certificates; using System.Windows.Forms; using System.Runtime.InteropServices; if文分岐内 using (Bitmap bmp = new Bitmap(diameter, diameter, PixelFormat.Format32bppArgb)){ using(Graphics g = Graphics.FromImage(bmp)) { g.Clear(Color.Transparent); DrawGraphics(g, h, x, y); (DrawGraphicsメソッドですべての描画を実施) } bmp.Save(ms, ImageFormat.Png); System.Windows.Forms.IDataObject dataObject = new DataObject(); dataObject.SetData("png", true, ms); Clipboard.SetDataObject(dataObject, true); bmp.Dispose(); ms.Dispose(); } } 透過画像なので、ImageFormatsやSetDataは"png"で指定しています。このまま実行すると、Office系のソフトには正常に透過画像が貼り付けられますが、貼り付け先がPDFだと貼り付けができません。ただし、Office系に貼り付けたあとの背景透過画像をそのままCtrl+Cでコピーし、PDFにCtrl+Vするとなぜか正常に貼り付けられます。Office系でコピーした時点で拡張メタファイルか何かに変換されているのでしょう… そもそも最初のbmpの時点で透過情報消えるやないか、と思っていましたが、Bitmapクラスは透過情報が保持できる?ようです。 そのため、C#のコード内でOffice系に貼り付け後のコピーの動作(おそらくpng→emf変換)を実装しようとしたのですが、 ImageFormats.Emf/SetData("emf")や、 ChatGPTにて ①png→メタファイル ②png→バイト列→メタファイル ③png→bmp→メタファイル(bmpの時点で透過情報が死ぬので不採用ですが、ChatGPTから提案され続けました。) など、すべて不発に終わりました。 ImageFormats.Emf/SetData("emf")、これに関しては、 コード内のbmp.Save(ms, ImageFormat.Emf);これの時点で、すでに変換に失敗しているようです。wmfにしてもダメでした(デバッグ開始でボタンを押すとnullが返ってくる) ラスター画像なので描画自体は少し汚いですが、WPFだと拡張メタファイルやクリップボードをうまく扱えませんでした… コピーの様子をみるためにWPFは途中まで書きましたが、メタファイルの扱いがうまくいきませんでした。私の知識がないだけかもしれませんが、有力な情報もヒットしません… その他情報必要な場合は追加しますので、よろしくお願いいたします。 アプリケーションの使用先OSはWin10/11です。

  • C#: DLL関数に整数の参照を渡すには?

    前略  @IT の”Win32 APIやDLL関数を呼び出すには?”(下記URL)を読んでVisual Studio 2012のC#をつかって、DLL関数に整数の参照を渡すプログラムをつくったのですが期待通り動作しません。 http://www.atmarkit.co.jp/fdotnet/dotnettips/024w32api/w32api.html  以下のソースコードのどこが間違っているのでしょうか? わかる方がいらっしゃったら教えてください。  ・マウスのボタンの数を取得して ラベルとメッセージボックスに表示するプログラムですが、いずれも 初期値の8が表示されて 参照による取得がうまくできません。また、GetNumberOfConsoleMouseButtons( ) の戻り値もFlase(0)が表示されます。  ・GetNumberOfConsoleMouseButtons( ) の諸元は下記です。 BOOL GetNumberOfConsoleMouseButtons( LPDWORD lpNumberOfMouseButtons // ボタン数のアドレス ); パラメータ lpNumberOfMouseButtons: マウスのボタン数を受け取る 32 ビット変数へのポインタを指定します。 戻り値 関数が成功すると、0 以外の値が返ります。 関数が失敗すると、0 が返ります。 以上、よろしくお願いします 以下、Form1.cs 全ソースコードです。 //---------------------------------------------------------- using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Runtime.InteropServices; // 追加 namespace DLL_呼出し_参照 { public partial class Form1 : Form { //宣言部 [DllImport("kernel32.dll")] extern static bool GetNumberOfConsoleMouseButtons(ref uint lpNumberOfMouseButtons); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { uint Num; bool Flag; Num = 8; Flag = GetNumberOfConsoleMouseButtons(ref Num); //関数の呼び出し label1.Text = Num.ToString(); label2.Text = Flag.ToString(); //戻り値 成功すると0以外が戻る string msg = String.Format("Num={0}",Num); MessageBox.Show(msg); //メッセージボックス表示 } } }

  • C#からパワーポイントを表示

    C#でパワーポイントの資料を立ち上げて表示したいと思っていますが、 うまくいきません。 どうかアドバイスをよろしくお願いします。 使用している環境は Windows XP Office 2003 Visual Studio 2005 です。 私が書いたソースは下記の通りです。 これを実行すると、パワーポイントのからっぽのものが 立ち上がりpptpathでしているファイルの中身が表示されない 状態となります。 よろしくお願いいたします。 以下、内容------------------- 「参照」でMicrosoft Object Libraryを読み込んでおり、 また以下をusingで指定します。 using System; using System.IO; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using Microsoft.Office.Interop.PowerPoint; using Microsoft.Office.Core; ・・・・以下が関数の該当部分です。 ApplicationClass app = new ApplicationClass(); app.Visible = MsoTriState.msoTrue; Presentation ppt = app.Presentations.Open(pptpath, MsoTriState.msoFalse, MsoTriState.msoFalse, MsoTriState.msoFalse); app.Activate(); よろしくお願いします。

  • Visual C# 2008 Express Editionで実行するとDOS窓が出る

    私はC#でフォームプログラミングを勉強しようと思い、「Visual C# 2008 Express Edition」をダウンロードして、取り合えずウィンドウを作るだけの簡単なプログラムを実行してみたのですが、ウィンドウと同時に黒い窓(DOS窓というのでしょうか)が現れてしまいます。 作成したアプリケーションデータを実行しても、やはり黒い画面が出てしまい困っています。 本に掲載されていたコードをウィンドウタイトルを変えて、そのままビルドしただけですし、本に付いてきたCD-ROMの中の同じサンプルプログラムのアプリケーションデータを実行しても、黒い画面は現れません。何か方法に誤りがあるのでしょうか、分かる方がいたら教えて頂きたいのですが、下がコードです。 using System; using System.Drawing; using System.Windows.Forms; public class Test : Form { protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); } static void Main() { Form form = new Test(); form.Text = "ウィンドウタイトル"; form.ClientSize = new Size(600, 400); form.BackColor = Color.FromArgb(0xff, 0xff, 0xff); Application.Run(form); } } 参照設定には、 System System.Drawing System.Windows.Forms を含めています。

  • Visual C# 2008カスタムコントロール

    Visual C# 2008カスタムコントロール Express Editionにはついてないのでしょうか? 会社のVisual Studioにはついてたのですが

  • Visual C++にて「再定義されています」と…

    VisualC++2010にて、OpenCVを導入しようといろいろ弄っていたら以下のような文章が出るようになりました。 1>------ ビルド開始: プロジェクト: imiwakaran, 構成: Debug Win32 ------ 1> stdafx.cpp 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(27): error C2371: 'size_t' : 再定義されています。異なる基本型です。 1> c:\users\ooka\documents\visual studio 2010\projects\imiwakaran\imiwakaran\predefined c++ types (compiler internal)(19) : 'size_t' の宣言を確認してください。 ========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ========== 再定義されているとのことなので書き換えようとしましたが、書き換えが不可能なファイルでした。 これのせいでHellow Worldすら実行できなくなりました。 Visual系のソフトをすべてアンインストールして、再インストールしましたが現状のままでした。 どなたか詳しい方、どうかお助けください。

  • Visual Studio C++初心者です.

    Visual studio C++ Express Editionを インストールして試しにただフォームに ラベルを付けるだけのプログラムを作って ビルドしてみましたところ プロジェクト : error PRJ0003 : 'cmd.exe' の起動中にエラーが発生しました。 というエラーが出てしまいました. 初心者なのでなにがエラーとなっているのか わからないので教えてください.

専門家に質問してみよう