あなたはあなたがして保存することができます新しいビットマップ、にそれが画面に表示さのものを描くPictureBox
を作成する必要があります!
Image
は元の形式で保存されるため、実際にはPictureBox
の表面に痛みを伴うPaint
イベントでは何も保存されませんが保存されます。だから、おそらくすべてのもの、すなわちImage
、BackgroundImage
、あなたがDrawToBitmap
somehwereを呼ぶだろうPaint
イベントで描くすべてを保存するために
。それは無限ループを引き起こし、新しいBitmap
を作成するPaint
イベントを呼び出しますよう
どこかはそれを呼び出すには..ないPaint
場合には、どこか
を他を意味あなたのような何かをするだろうこの:
Bitmap bmpSave = new Bitmap(pictureBox1.ClientSize.Width, pictureBox1.ClientSize.Height);
pictureBox1.DrawToBitmap(bmpSave, pictureBox1.ClientRectangle);
これは本当にあなたが望むものではありませんか?実際にImage
を変更したいのですか?その場合、ではなくはPaint
イベントを使用してください。あなたは、スケーリングからトリガされているどこからこれを呼び出すことができ
Bitmap bmpSave = new Bitmap(yourNewWidth, yourNewHeight);
using (Graphics g = Graphics.FromImage(bmpSave))
{
g.ScaleTransform(ratio * zoomFac, ratio * zoomFac);
g.DrawImage((Bitmap)pictureBox1.Image, 0, 0); //
pictureBox1.Image = bmpSave;
bmpSave.Save(...);
}
:
代わりにこのような何かを行います。
スケーリングを繰り返すと、以前のスケーリングされたバージョンから毎回が品質が低下することに注意してください。かなり高速です。これは、オリジナルの保存されたバージョンから常に拡大縮小されます。
Btw:スケーリングにMatrix
を使用しても、実際にはScaleTransform
との違いはありません。
しかし、直接スケーリングを行う場合は、という2つの数値を持つDrawImage
のオーバーロードを使用しないでください。Rectangles
?
int newWidth = 100; int newHeight = 100; string yourFileName = "D:\\xyz123.jpg";
Bitmap bmpSave = new Bitmap(pictureBox1.ClientSize.Width, pictureBox1.ClientSize.Height);
Rectangle newRectangle = new Rectangle(0, 0, newWidth, newHeight);
Rectangle oldRectangle = new Rectangle(Point.Empty, pictureBox1.Image.Size);
using (Graphics g = Graphics.FromImage(bmpSave))
{
g.DrawImage((Bitmap)pictureBox1.Image, newRectangle, oldRectangle, GraphicsUnit.Pixel);
bmpSave.Save(yourFileName, ImageFormat.Jpeg);
}
とスケーリングBitmap
コンストラクタそこにある:すべてはあなたが拡大し、多分さらに他のものを描くようにしたい場合、これは...最も一般的なソリューションです私は希望
Bitmap bmp = new Bitmap(pictureBox1.Image, newWidth, newHeight);
は、 Image
の縮尺を変更することをお勧めします。他の解決策として、それはあなたがPictureBox
に戻ってそれを割り当てるまでImage
が表示変更されません..:
は古いイメージを処分することを忘れないでください
pictureBox1.Image = bmp ;
...あなたの答えのための
こんにちはおかげで、そのbmpSaveを使用すると、ゆがんだ画像が保存されますが、画像の周りの領域も画像ボックスの境界まで保存されます。 (ピクチャーボックスは640x480です)、画像は少なくなります。目的は歪んだ画像だけを保存することです、私はそうですか? – hephestos
はい、その場合、新しいBitmapのPictureBoxの古いサイズを使用しないでください! – TaW
親愛なるTawはい、あなたが与えた2番目のスニペットは、私が望むものに近いです。どうすれば新しいビットマップのサイズを再計算できますか? scaletransformはbmpsaveの作成後に来るからです。 "newwidth"でbmpSaveを作成しますが、実際にscaletransformを呼び出すまではnewwidthはわかりません。右? – hephestos