Вам нужно сделать PictureBox
рисовать вещи он показывает на экране в нового Bitmap, который затем можно сохранить!
Как это Image
будет сохранен в первоначальном виде, и ничего вы сделали в Paint
события, которое фактически painst на поверхность PictureBox
будет сохранена.
Таким образом, чтобы сохранить все, т.е. Image
, возможно, BackgroundImage
и все вы рисуете в Paint
случае вы бы назвали DrawToBitmap
somehwere.
Где-то значит где-то , а не в Paint
случае, как это будет вызывать Paint
событие, чтобы создать новый Bitmap
, вызывая бесконечный цикл ..
Для вызова вы могли бы сделать что-то вроде это:
Bitmap bmpSave = new Bitmap(pictureBox1.ClientSize.Width, pictureBox1.ClientSize.Height);
pictureBox1.DrawToBitmap(bmpSave, pictureBox1.ClientRectangle);
Возможно, это не совсем то, что вы хотите? Может быть, вы действительно хотите изменить Image
? В этом случае do не использовать событие 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
.
Но если вы хотите, чтобы сделать прямое масштабирование почему бы не использовать 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
. Как и другие решения не изменит Image
отображаться, пока вы не назначите его обратно в PictureBox
..:
pictureBox1.Image = bmp ;
Не забудьте избавиться от старого изображения ..
Привет спасибо за Ваш ответ, могу ли я сказать, что если я использую этот bmpSave, он сохранит искаженное изображение, а также область вокруг изображения до границ изображения? (картинка - 640x480), изображение меньше. цель состоит в том, чтобы сохранить только искаженное изображение, верно? – hephestos
Да, в этом случае не используйте старый размер PictureBox для нового Bitmap! – TaW
Дорогой Тау, второй фрагмент, который вы дали, ближе к тому, что я хочу. Что я могу пересчитать размер нового растрового изображения? Поскольку scaletransform возникает после создания bmpsave. Вы создаете bmpSave с «newwidth», но на самом деле я не знаю новую ширину, пока не назову scaletransform. Правильно? – hephestos