Bitmapの切出しについて – プログラミング – Home

通知
すべてクリア

[解決済] Bitmapの切出しについて

固定ページ 1 / 2

Single Father
 Single Father
(@Single Father)
ゲスト
結合: 16年前
投稿: 14
Topic starter  

環境は、VS2005 VC++ CLIです。

ビットマップを指定した位置とサイズで切出して切出した
ビットマップを別のファイル名で保存させるにはどのよう
にすればいいでしょうか?

BitmapクラスとGraphicクラスを組み合わせて実現できると
思いますがネットでいろいろ探しましたがサンプル等があま
りなかったので・・・。

切出した画像を他のBitmapにDrawImageすることは出来たの
ですが切出した画像そのものを保存する方法が分かりません。

どなたかアドバイス宜しくお願いします。


引用未解決
トピックタグ
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

>切出した画像を他のBitmapにDrawImageすることは出来たの
Saveメソッドが使えませんか?

Bitmap..::.Save メソッド
http://msdn.microsoft.com/ja-jp/library/system.drawing.bitmap.save.aspx


返信引用
Single Father
 Single Father
(@Single Father)
ゲスト
結合: 16年前
投稿: 14
Topic starter  

>Blueさん

早速のレスありがとうございます。

すみません、質問の仕方が少々甘かったです。

保存はSaveメソッドで出来そうですが元々の画像が3008×2000の
サイズがあったとしてその画像から一部4cm×4cmを切出した後に
切出した画像を4cm×4cmのまま直接保存させたいのです。

この場合、DrawImageはどこに対して行えばよいのでしょうか?


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

新たに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上のビットマップでセンチって・・・)


返信引用
rin
 rin
(@rin)
ゲスト
結合: 18年前
投稿: 112
 

セーブするときは元画像のことは忘れて

>切出した画像を他のBitmapにDrawImageすることは出来たの
この切り出し先の「他のBitmap」をセーブすればいい
「他のBitmap」を、切り出したいサイズで作成しておくのを忘れずに


返信引用
Single Father
 Single Father
(@Single Father)
ゲスト
結合: 16年前
投稿: 14
Topic starter  

>Blueさん

Sampleクラスありがとうございます。まさにやりたいことそのもの
でした。

>4cm×4cm
>センチ単位の場合は変換が必要そう。(PC上のビットマップでセンチって・・・)

すみません(><)ピクセルの誤りでした(汗)

勉強のために質問させてください。

Rectangle% part

としているのですがCLIでは

Rectangle^ partでは駄目なのでしょうか?

確かにRectangle^ partで書くとDrawImageの引数でRectangleからfloatに変換出来ませ
んとエラーになります。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

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);
とすることになるでしょう。


返信引用
Single Father
 Single Father
(@Single Father)
ゲスト
結合: 16年前
投稿: 14
Topic starter  

>Blueさん

>Rectangleはvalueクラスなので通常は ^ を使いません。

Valueクラスでしたか。てっきりBitmapクラスやGraphicクラスと
同じ扱いだと思っていました。勉強になりました。

>%をつけたのは、CopyBitmap内でpartを変更しないから参照渡しに
>すれば無駄なコピーがなくなるかなと。

確かに関数内部では値を変更しないので参照渡しにすれば無駄な
コピーがなくなりますね。

画像系を扱うクラスについてまだまだ知識不足なのでこれを機会に
もっといろいろと学んで行きたいと思います。

また不明点があった際は宜しくお願い致します。


返信引用
Single Father
 Single Father
(@Single Father)
ゲスト
結合: 16年前
投稿: 14
Topic starter  

>Blueさん

たびたびすみません。

先程のクラスを使用して実装してみました。

Rectangleに渡す引数を変えるとで確かに指定した値で画像がトリミング
されて保存されますが保存された画像を確認すると画像ピクセルは指定し
たピクセルあるのですが肝心な画像が縮小表示されてしまっています。

画像を縮小せずにオリジナルのままトリミングして保存させたいのですが
何か良い方法はありますでしょうか?


返信引用
Single Father
 Single Father
(@Single Father)
ゲスト
結合: 16年前
投稿: 14
Topic starter  

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;
}

------------------------------------------------------------------------


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

>左上に縮小表示されているだけ
本当にそうなりますか?

VC++ 2008 Expressで試しましたが再現しませんでした。
ちなみに、Sample.bmpはペイントでまず2000×2000のサイズにして任意の色で背景色を塗
りつぶして、その後2500×3000にして塗りつぶしていないところを違う色で塗りつぶした
ものをつかって試してみました。


返信引用
Single Father
 Single Father
(@Single Father)
ゲスト
結合: 16年前
投稿: 14
Topic starter  

>Blueさん

返信ありがとうございます。

>Sample.bmpはペイントでまず2000×2000のサイズにして任意の色で背景色を塗
>りつぶして、その後2500×3000にして塗りつぶしていないところを違う色で塗り
>つぶしたものをつかって試してみました。

確かに上記の方法では2000×2000のサイズでキレイ切取られて表示されますが
実際のデジカメ等で撮影した写真で確認すると元画像より小さく見えてしまう
のですが目の錯覚ですかね?

ピクセル単位での切出しはなかなか確認する手段がなくて難しいです(><)


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

> 目の錯覚ですかね?
なにで確認されているのでしょうか?
ペイント等の画像サイズによってズームして表示されないソフトで確認してもそうなり
ますか?
(Windowsのビューアとかではズームして表示されたりする)


返信引用
Single Father
 Single Father
(@Single Father)
ゲスト
結合: 16年前
投稿: 14
Topic starter  

>Blueさん

おはようございます

>ペイント等の画像サイズによってズームして表示されない
>ソフトで確認してもそうなりますか?

人物の写真なのですがペイントでも確認しましたがやはり
元画像より人物が小さく見えます。目で見て確認できるく
らい人物のサイズに違いがありました・・・。

ペイントの背景色だけだと上手く切出せているだけに謎で
すね・・・(><)


返信引用
えちぜん
 えちぜん
(@えちぜん)
ゲスト
結合: 18年前
投稿: 15
 

それぞれのBitmapのDPIが異なっているのではないでしょうか。
http://msdn.microsoft.com/ja-jp/library/ms142041(VS.80).aspx
実際に試したわけではないので間違っているかもしれません。


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました