FC2ブログ

スポンサーサイト

スポンサー広告
-- /-- --
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[C#]IntPtrからBitmapオブジェクトを作る[むー]

C#
05 /24 2009
OpenCVなんかで画像作ると高速化のためそのままIntptrで使い続ける事が多いんだけど、
高速化を目的としないときは利便性が落ちる。

開発効率を優先する為に速度を犠牲にして作業する為のメモ

IntPtr pt = Marshal.AllocHGlobal(1228800);

ImageBuf = new Bitmap(640,
480,
2560,
System.Drawing.Imaging.PixelFormat.Format32bppArgb,
pt);

C#でIRC

C#
05 /10 2009
たぶんシリーズになると思う何か。

PRIVMSGで日本語を送ろうとすると化ける対策。

Encoding enc = Encoding.GetEncoding("iso-2022-jp");
byte[] bytData = enc.GetBytes(textBox2.Text.ToCharArray());
writer.WriteLine("PRIVMSG " + CHANNEL + " :" + bytData.ToString());


だと駄目だったので

Encoding enc = Encoding.GetEncoding("iso-2022-jp");
StreamWriter (stream, enc);


としてやればOK
(最初の奴はテスト中のコメントアウトを適当に拾ったので、書式が間違っているので注意)


次回はどこかでつまづいたらまた書く。
続く?

今日見つけた記述[むー]

C#
04 /26 2009
なんか便利そうなのでメモ

bool FLG = (A < B)?true:false;

foreach()と一緒でC#な表現なんかね、これ。
あとは代入時のA=B=Cとか。

これらって記述は楽なんだけど、
コンパイル後の動作速度はどうなんだろうねぇ・・

インデックス付きの画像からグラフィックオブジェクトを作成する[むー]

C#
04 /20 2009
『インデックス付きのピクセル形式をもつイメージからグラフィックス オブジェクトを作成することはできません』なるエラーが出る時の対処方法。


■駄目なパターン■
Bitmap bmp = new Bitmap(FilePath);
Graphics g = Graphics.FromImage(bmp);



■改善版■
Bitmap src = new Bitmap(FilePath);
Bitmap Bmp = new Bitmap(src.Width, src.Height);
Graphics g = Graphics.FromImage(Bmp);
g.DrawImage(src, 0, 0, src.Width, src.Height);
src.Dispose();



先にグラフィックオブジェクトを欲しいサイズで作っておいて、
そこへあらかじめ読み込んだイメージをコピーする事で、
読み込み元のイメージフォーマットを無視する事が出来る。


■応用■
Bitmap src = new Bitmap(FilePath);
Bitmap Bmp = new Bitmap(src.Width, src.Height, PixelFormat.Format24bppRgb);
Graphics g = Graphics.FromImage(Bmp);
g.DrawImage(src, 0, 0, src.Width, src.Height);
src.Dispose();


このように、読み込み元のフォーマットにかかわらず、
指定のフォーマットに変更することも可能。


※using使うとdisposeが減らせるらしい
Bitmap destImage = new Bitmap(size);
using (Bitmap srcImage = new Bitmap(filename))
using (Graphics destGraphics = Graphics.FromImage(destImage))
{
destGraphics.DrawImage(srcImage, Rectangle, Rectangle);
}
destImage.Save(filename, format);

======================================
Bitmap destImage = new Bitmap(100,100);
using (Bitmap srcImage = new Bitmap(@"filename.PNG"))
using (Graphics destGraphics = Graphics.FromImage(destImage))
destGraphics.DrawImage(srcImage, dstRect,0,0,100,100,GraphicsUnit.Pixel);
destImage.Save(@"filename.PNG", ImageFormat.Png);
destImage.Dispose();

改行付きテキストボックスのデータを扱う[むー]

C#
04 /19 2009
テキストボックスのMultilineをtrueにして、それを各行に分けて処理をしたい場合、
RegexクラスのSplitメソッドを使うのですが、これが無茶苦茶おっそい!

そこでVisualBasic.StringsクラスのSplitメソッドを使うという飛び道具も有る様ですが、
もう一歩踏み込んでstring.Splitを使用する方法をメモ


textBox1.Text.Replace("¥r¥n", "¥n").Split('¥n');


テキストボックス内の改行は"rn"なので、それを"n"に置き換えて処理する。
こうする事によって高速にテキストボックス内のテキストを配列に格納する事が出来ます。

C#テキストボックス謎の挙動[むー]

C#
04 /16 2009
TextBoxのTextプロパティにコードから値を代入すると、次回フォーカス取得時になぜか全選択された状態になる。

これって、何気に作ってると非常に見栄えがよろしくない上に、
まともにやると回避も意外と面倒だったりする。


以下の方法で回避可能

textBox1.Text = "テキスト";
textBox1.SelectionStart = textBox1.SelectionStart;



どうやら仕様らしいんだけど、なんか気持ち悪い上、代入のたびにこれってのもなぁ・・・


面倒な場合はカスタムコントロールって選択肢もあるっぽい
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=38093&forum=7


今日覚えたショートカット
【WIN】+【R】を押して「名前を指定して実行」

Graphicオブジェクトの注意点[むー]

C#
04 /15 2009
毎回なんとなくで作っていたGraphicオブジェクトだが、CreateGraphics()が妙に遅く感じたので、
調査して見ると以下の事が解った

Graphicsオブジェクトを作成する方法は3つ。
1.Imageオブジェクトから作成
2.CreateGraphicsメソッドを使う方法
3.PaintイベントのPaintEventArgsから取得する方法


2よりも1の方法が10倍近く高速に処理を行える
3は用意した状態の再描画専用で、ほかの事をしないのが定石
(再描画の度に複雑な処理を行わない)


メモ
CTL+F5 でリリースビルド

C#でgifの透過情報を簡単に扱う[むー]

C#
03 /22 2009
C#で透過付きgif89aを簡単に扱う方法を紹介します。


読み込んだ段階でbitmapクラスに黒く変更された色情報の復旧について書かれている事が少なかった為、覚書。


Bitmap img = Bitmap("image.gif");

とするとPixelFormatはFormat8bppIndexedでは無く
Format32bppArgbでBitmapオブジェクトがインスタンスされます。
その際、透過色に指定されている色が元の色に関係なく黒に変換されてしまいます。

そのため、何らかの処理を経て、透過の表示を行おうとすると、
透過部分が黒く塗りつぶされた状態になってしまいます。

それを回避するためには、途中の処理で使うbitmapクラスをすべて
Format32bppArgbで処理を行えば下記の状態で透過を残すことが出来ます。


すでに読み込んで有るデータの通常の黒は
Color.FromArgb(255, 0, 0, 0);
読み込み時に変更された黒が
Color.FromArgb(0, 0, 0, 0);
であるため、通常の黒と見分けることが出来ます。


ほとんどの画像処理を高速化するサンプルが、unsafeコードで一旦Format24bppRgbに変換を行っているために、そのまま処理を行うとアルファ情報が落ちていると思います。

Format32bppArgb版のサンプルは『続き』を参照してください。


また、読み込んだままFormat8bppIndexedに無理やり戻してもアルファ情報が落ちます。
Format8bppIndexedに戻すには一旦アルファ値が0の黒を元のパレットの透過色に戻してから変換する必要が有ります。

ColorPaletteを使ったパレットデータを変更する方法はあちこちで記されていますが、読み込んだ段階でFormat32bppArgbに変更されているため、この変更された色はパレットデータのアルファを0から255に書き換えて適用しても復元できませんでした。


通常黒と透過で変更された黒が見分けられれば、
保存やサイズ変更への応用も出来ると思います。


『続きを読む』に読み込んだgifでフォームを切り取るサンプルを置きましたので、ご参考になればと思います。


どなたかの助けになれば幸いです。

write by むー

続きを読む

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。