環境は、VS2005 VC++ CLIです。
ビットマップを指定した位置とサイズで切出して切出した
ビットマップを別のファイル名で保存させるにはどのよう
にすればいいでしょうか?
BitmapクラスとGraphicクラスを組み合わせて実現できると
思いますがネットでいろいろ探しましたがサンプル等があま
りなかったので・・・。
切出した画像を他のBitmapにDrawImageすることは出来たの
ですが切出した画像そのものを保存する方法が分かりません。
どなたかアドバイス宜しくお願いします。
>切出した画像を他のBitmapにDrawImageすることは出来たの
Saveメソッドが使えませんか?
Bitmap..::.Save メソッド
http://msdn.microsoft.com/ja-jp/library/system.drawing.bitmap.save.aspx
>Blueさん
早速のレスありがとうございます。
すみません、質問の仕方が少々甘かったです。
保存はSaveメソッドで出来そうですが元々の画像が3008×2000の
サイズがあったとしてその画像から一部4cm×4cmを切出した後に
切出した画像を4cm×4cmのまま直接保存させたいのです。
この場合、DrawImageはどこに対して行えばよいのでしょうか?
新たにBitmapインスタンスを作ればいいだけの話では?
http://msdn.microsoft.com/ja-jp/library/ms172505.aspx
の
ビットマップの一部をコピーするには
を参考に
Bitmap^ CopyBitmap(Bitmap^ source, Rectangle% part)
{
Bitmap^ bmp = gcnew Bitmap(part.Width, part.Height);
Graphics^ g = Graphics::FromImage(bmp);
g->DrawImage(source, 0, 0, part, GraphicsUnit::Pixel);
delete g;
return bmp;
}
というメソッドを作って、呼び出し側で
Rectangle part(0, 0, 100, 100);
Bitmap^ dest = CopyBitmap(元となるBitmapのインスタンス, part);
dest->Save(Lほげ.bmp);
delete dest;
という具合で。
>4cm×4cm
センチ単位の場合は変換が必要そう。(PC上のビットマップでセンチって・・・)
セーブするときは元画像のことは忘れて
>切出した画像を他のBitmapにDrawImageすることは出来たの
この切り出し先の「他のBitmap」をセーブすればいい
「他のBitmap」を、切り出したいサイズで作成しておくのを忘れずに
>Blueさん
Sampleクラスありがとうございます。まさにやりたいことそのもの
でした。
>4cm×4cm
>センチ単位の場合は変換が必要そう。(PC上のビットマップでセンチって・・・)
すみません(><)ピクセルの誤りでした(汗)
勉強のために質問させてください。
Rectangle% part
としているのですがCLIでは
Rectangle^ partでは駄目なのでしょうか?
確かにRectangle^ partで書くとDrawImageの引数でRectangleからfloatに変換出来ませ
んとエラーになります。
Rectangleはvalueクラスなので通常は ^ を使いません。
よって、
Bitmap^ CopyBitmap(Bitmap^ source, Rectangle part)
とすればいいです。
%をつけたのは、CopyBitmap内でpartを変更しないから参照渡しにすれば無駄なコピーが
なくなるかなと。
ちなみに、^をつける場合、呼び出し側で
Bitmap^ dest = CopyBitmap(元となるBitmapのインスタンス, %part);
、
>g->DrawImage(source, 0, 0, part, GraphicsUnit::Pixel);
g->DrawImage(source, 0, 0, *part, GraphicsUnit::Pixel);
とすることになるでしょう。
>Blueさん
>Rectangleはvalueクラスなので通常は ^ を使いません。
Valueクラスでしたか。てっきりBitmapクラスやGraphicクラスと
同じ扱いだと思っていました。勉強になりました。
>%をつけたのは、CopyBitmap内でpartを変更しないから参照渡しに
>すれば無駄なコピーがなくなるかなと。
確かに関数内部では値を変更しないので参照渡しにすれば無駄な
コピーがなくなりますね。
画像系を扱うクラスについてまだまだ知識不足なのでこれを機会に
もっといろいろと学んで行きたいと思います。
また不明点があった際は宜しくお願い致します。
>Blueさん
たびたびすみません。
先程のクラスを使用して実装してみました。
Rectangleに渡す引数を変えるとで確かに指定した値で画像がトリミング
されて保存されますが保存された画像を確認すると画像ピクセルは指定し
たピクセルあるのですが肝心な画像が縮小表示されてしまっています。
画像を縮小せずにオリジナルのままトリミングして保存させたいのですが
何か良い方法はありますでしょうか?
Sample.bmpを2000×2000で切出してtest.bmpという名前で保存させた時
にtest.bmpを確認するとピクセル数は2000×2000ありますが切出した画像
が左上に縮小表示されているだけになってしまっており残りの部分は描画さ
れていない状態です。
元画像のSample.bmpは2500×3000ピクセルです。縮小表示されずに切出
した画像を2000×2000のオリジナルのまま表示したいのですが何か方法は
ありますでしょうか?
以下が記述したコードです。
-----------------------------------------------------------------------
Bitmap^ bitmap = gcnew Bitmap(Sample.bmp);
Rectangle part(0, 0, 2000, 2000);
Bitmap^ dest = CopyBitmap(bitmap, part);
dest->Save(Ltest.bmp);
delete dest;
Bitmap^ CopyBitmap(Bitmap^ source, Rectangle% part)
{
Bitmap^ bmp = gcnew Bitmap(part.Width, part.Height);
Graphics^ g = Graphics::FromImage(bmp);
g->DrawImage(source, 0, 0, part, GraphicsUnit::Pixel);
delete g;
return bmp;
}
------------------------------------------------------------------------
>左上に縮小表示されているだけ
本当にそうなりますか?
VC++ 2008 Expressで試しましたが再現しませんでした。
ちなみに、Sample.bmpはペイントでまず2000×2000のサイズにして任意の色で背景色を塗
りつぶして、その後2500×3000にして塗りつぶしていないところを違う色で塗りつぶした
ものをつかって試してみました。
>Blueさん
返信ありがとうございます。
>Sample.bmpはペイントでまず2000×2000のサイズにして任意の色で背景色を塗
>りつぶして、その後2500×3000にして塗りつぶしていないところを違う色で塗り
>つぶしたものをつかって試してみました。
確かに上記の方法では2000×2000のサイズでキレイ切取られて表示されますが
実際のデジカメ等で撮影した写真で確認すると元画像より小さく見えてしまう
のですが目の錯覚ですかね?
ピクセル単位での切出しはなかなか確認する手段がなくて難しいです(><)
> 目の錯覚ですかね?
なにで確認されているのでしょうか?
ペイント等の画像サイズによってズームして表示されないソフトで確認してもそうなり
ますか?
(Windowsのビューアとかではズームして表示されたりする)
>Blueさん
おはようございます
>ペイント等の画像サイズによってズームして表示されない
>ソフトで確認してもそうなりますか?
人物の写真なのですがペイントでも確認しましたがやはり
元画像より人物が小さく見えます。目で見て確認できるく
らい人物のサイズに違いがありました・・・。
ペイントの背景色だけだと上手く切出せているだけに謎で
すね・・・(><)
それぞれのBitmapのDPIが異なっているのではないでしょうか。
http://msdn.microsoft.com/ja-jp/library/ms142041(VS.80).aspx
実際に試したわけではないので間違っているかもしれません。