Всем привет. Возможно кому-нибудь поможет мое решение, как можно из jpeg файла разрезать на равный части все изображение и сохранить их.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
public partial class Form1 : Form { public Form1() { InitializeComponent(); } // Разделите файл. private void btnGo_Click(object sender, EventArgs e) { // Ожидаем ввод данных о размераз, на которые будем разрезать изображение int wid = int.Parse(txtWidth.Text); int hgt = int.Parse(txtHeight.Text); Bitmap bm = LoadUnlocked(txtFile.Text); // Начните разбивать растровое изображение. string piece_name = Path.GetFileNameWithoutExtension(txtFile.Text); Bitmap piece = new Bitmap(wid, hgt); Rectangle dest_rect = new Rectangle(0, 0, wid, hgt); using (Graphics gr = Graphics.FromImage(piece)) { int num_rows = bm.Height / hgt; int num_cols = bm.Width / wid; Rectangle source_rect = new Rectangle(0, 0, wid, hgt); for (int row = 0; row < num_rows; row++) { source_rect.X = 0; for (int col = 0; col < num_cols; col++) { // Скопируйте кусок изображения. gr.DrawImage(bm, dest_rect, source_rect, GraphicsUnit.Pixel); // Сохраним вырезаную часть изображения. string filename = piece_name + row.ToString("00") + col.ToString("00") + ".jpg"; piece.Save(filename, ImageFormat.Jpeg); // Переходим к следующему столбцу. source_rect.X += wid; } source_rect.Y += hgt; } MessageBox.Show("Создаем " + num_rows * num_cols + " фаил", "Done", MessageBoxButtons.OK, MessageBoxIcon.Information); } } // Загружаем растровое изображение, не блокируя сам файл. private Bitmap LoadUnlocked(string file_name) { using (Bitmap bm = new Bitmap(file_name)) { return new Bitmap(bm); } } } |
Задаем входные параметры размеры на которые будем разрезать и путь к нашему изображению. В итоге на выходе в зависимости от параметров и размера изображения мы получим множество частей.
Твой код накладывает фрагменты друг на друга, из-за чего при работе с полупрозрачными изображениями получится каша.
Чтобы этого избежать, можно сократить область видимости Graphics gr и объявлять Bitmap piece внутри вложенного цикла. Вот так будет выглядеть код с моими правками:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
// Разделите файл.
private void btnGo_Click(object sender, EventArgs e)
{
// Ожидаем ввод данных о размераз, на которые будем разрезать изображение
int wid = int.Parse(txtWidth.Text);
int hgt = int.Parse(txtHeight.Text);
Bitmap bm = LoadUnlocked(txtFile.Text);
// Начните разбивать растровое изображение.
string piece_name = Path.GetFileNameWithoutExtension(txtFile.Text);
Rectangle dest_rect = new Rectangle(0, 0, wid, hgt);
int num_rows = bm.Height / hgt;
int num_cols = bm.Width / wid;
Rectangle source_rect = new Rectangle(0, 0, wid, hgt);
for (int row = 0; row < num_rows; row++)
{
source_rect.X = 0;
for (int col = 0; col < num_cols; col++)
{
Bitmap piece = new Bitmap(wid, hgt);
using (Graphics gr = Graphics.FromImage(piece))
{
// Скопируйте кусок изображения.
gr.DrawImage(bm, dest_rect, source_rect, GraphicsUnit.Pixel);
}
// Сохраним вырезаную часть изображения.
string filename = piece_name +
row.ToString("00") +
col.ToString("00") + ".jpg";
piece.Save(filename, ImageFormat.Jpeg);
// Переходим к следующему столбцу.
source_rect.X += wid;
}
source_rect.Y += hgt;
}
MessageBox.Show("Создаем " + num_rows * num_cols + " фаил",
"Done", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
// Загружаем растровое изображение, не блокируя сам файл.
private Bitmap LoadUnlocked(string file_name)
{
using (Bitmap bm = new Bitmap(file_name))
{
return new Bitmap(bm);
}
}
}