Как склеить две картинки в одну

zombie

Client
Регистрация
14.08.2012
Сообщения
480
Благодарностей
119
Баллы
43
Всех с прошедшими праздниками!

Подскажите, пожалуйста, как склеить две картинки в одну?
Чтобы получилось:

картинка1
картинка2
*по вертикали
 

Ribas

Client
Регистрация
31.05.2014
Сообщения
1 440
Благодарностей
503
Баллы
113

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 552
Баллы
113

zombie

Client
Регистрация
14.08.2012
Сообщения
480
Благодарностей
119
Баллы
43
Благодарю, а с помощью сниппета никак?
 

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 122
Баллы
113
Благодарю, а с помощью сниппета никак?
Нубский код:
C#:
string img1 = @"C:\image1.jpg"; // Картинка раз
string img2 = @"C:\image2.jpg"; // Картинка два

Bitmap bm1 = new Bitmap(img1, true);
Bitmap bm2 = new Bitmap(img2, true);

int width = bm1.Width;
int height = bm1.Height + bm2.Height;

Bitmap bm = new Bitmap(width, height);

Graphics g = Graphics.FromImage(bm);
g.DrawImage(bm1, 0, 0, bm1.Width, bm1.Height);
g.DrawImage(bm2, 0, bm1.Height, bm2.Width, bm2.Height);

bm.Save(@"C:\newImage.jpg"); // Новая картинка

bm.Dispose();
bm1.Dispose();
bm2.Dispose();
ЗЫ. Картинки должны быть одинаковой ширины, а то будут белые пустоты.
 
Последнее редактирование:

vasyaya

Client
Регистрация
09.02.2015
Сообщения
555
Благодарностей
35
Баллы
28
Нубский код:
C#:
string img1 = @"C:\image1.jpg"; // Картинка раз
string img2 = @"C:\image2.jpg"; // Картинка два

Bitmap bm1 = new Bitmap(img1, true);
Bitmap bm2 = new Bitmap(img2, true);

int width = bm1.Width;
int height = bm1.Height + bm2.Height;

Bitmap bm = new Bitmap(width, height);

Graphics g = Graphics.FromImage(bm);
g.DrawImage(bm1, 0, 0, bm1.Width, bm1.Height);
g.DrawImage(bm2, 0, bm1.Height, bm2.Width, bm2.Height);

bm.Save(@"C:\newImage.jpg"); // Новая картинка

bm.Dispose();
bm1.Dispose();
bm2.Dispose();
ЗЫ. Картинки должны быть одинаковой ширины, а то будут белые пустоты.
отлично!
 
  • Спасибо
Реакции: Rainsteel

Deadman

Client
Регистрация
24.09.2011
Сообщения
75
Благодарностей
3
Баллы
8
Нубский код:
C#:
string img1 = @"C:\image1.jpg"; // Картинка раз
string img2 = @"C:\image2.jpg"; // Картинка два

Bitmap bm1 = new Bitmap(img1, true);
Bitmap bm2 = new Bitmap(img2, true);

int width = bm1.Width;
int height = bm1.Height + bm2.Height;

Bitmap bm = new Bitmap(width, height);

Graphics g = Graphics.FromImage(bm);
g.DrawImage(bm1, 0, 0, bm1.Width, bm1.Height);
g.DrawImage(bm2, 0, bm1.Height, bm2.Width, bm2.Height);

bm.Save(@"C:\newImage.jpg"); // Новая картинка

bm.Dispose();
bm1.Dispose();
bm2.Dispose();
ЗЫ. Картинки должны быть одинаковой ширины, а то будут белые пустоты.
отличный код) А если картинки разной ширины, к примеру 1ая 500 пикселей, 2ая 300, как сделать, чтобы нижняя была по центру верхней? (пустоты пусть закрывает белым)
 

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 983
Благодарностей
4 434
Баллы
113
отличный код) А если картинки разной ширины, к примеру 1ая 500 пикселей, 2ая 300, как сделать, чтобы нижняя была по центру верхней? (пустоты пусть закрывает белым)
Учите геометрию и арифметику, вычисляйте размеры, пропорции и передвигайте в классе Bitmapa на нужные отступы.
 

juk88

Client
Регистрация
30.05.2018
Сообщения
90
Благодарностей
12
Баллы
8
Нубский код:
C#:
string img1 = @"C:\image1.jpg"; // Картинка раз
string img2 = @"C:\image2.jpg"; // Картинка два

Bitmap bm1 = new Bitmap(img1, true);
Bitmap bm2 = new Bitmap(img2, true);

int width = bm1.Width;
int height = bm1.Height + bm2.Height;

Bitmap bm = new Bitmap(width, height);

Graphics g = Graphics.FromImage(bm);
g.DrawImage(bm1, 0, 0, bm1.Width, bm1.Height);
g.DrawImage(bm2, 0, bm1.Height, bm2.Width, bm2.Height);

bm.Save(@"C:\newImage.jpg"); // Новая картинка

bm.Dispose();
bm1.Dispose();
bm2.Dispose();
ЗЫ. Картинки должны быть одинаковой ширины, а то будут белые пустоты.
А, как сделать, чтоб тоже самое, но картинки склеивались одна за одной по горизонтали?
 

HastaLaVista

Client
Регистрация
29.10.2018
Сообщения
163
Благодарностей
153
Баллы
43
А, как сделать, чтоб тоже самое, но картинки склеивались одна за одной по горизонтали?
C# не знаю, но по логике видимо так -

Код:
string img1 = @"C:\image1.jpg"; // Картинка раз
string img2 = @"C:\image2.jpg"; // Картинка два

Bitmap bm1 = new Bitmap(img1, true);
Bitmap bm2 = new Bitmap(img2, true);

int width = bm1.Width + bm2.Width;
int height = bm1.Height;

Bitmap bm = new Bitmap(width, height);

Graphics g = Graphics.FromImage(bm);
g.DrawImage(bm1, 0, 0, bm1.Width, bm1.Height);
g.DrawImage(bm2, bm1.Width, 0, bm2.Width, bm2.Height);

bm.Save(@"C:\newImage.jpg"); // Новая картинка

bm.Dispose();
bm1.Dispose();
bm2.Dispose();
 
  • Спасибо
Реакции: redman и juk88

juk88

Client
Регистрация
30.05.2018
Сообщения
90
Благодарностей
12
Баллы
8
C# не знаю, но по логике видимо так -

Код:
string img1 = @"C:\image1.jpg"; // Картинка раз
string img2 = @"C:\image2.jpg"; // Картинка два

Bitmap bm1 = new Bitmap(img1, true);
Bitmap bm2 = new Bitmap(img2, true);

int width = bm1.Width + bm2.Width;
int height = bm1.Height;

Bitmap bm = new Bitmap(width, height);

Graphics g = Graphics.FromImage(bm);
g.DrawImage(bm1, 0, 0, bm1.Width, bm1.Height);
g.DrawImage(bm2, bm1.Width, 0, bm2.Width, bm2.Height);

bm.Save(@"C:\newImage.jpg"); // Новая картинка

bm.Dispose();
bm1.Dispose();
bm2.Dispose();
Спасибо всё отлично работает. С логикой у Вас всё в порядке. А, может она вам подскажет, как склеить так-же не 2 а 3 картинки?
 

HastaLaVista

Client
Регистрация
29.10.2018
Сообщения
163
Благодарностей
153
Баллы
43
Спасибо всё отлично работает. С логикой у Вас всё в порядке. А, может она вам подскажет, как склеить так-же не 2 а 3 картинки?
Логика-то подскажет, куда она денется, но лучше самому попробовать - это ведь совсем не сложно.
Декларируем еще по одному string и bitmap, суммируем еще одну переменную с шириной третьего битмапа с первыми двумя. Вызываем еще один раз g.DrawImage указав новые координаты для третьей картинки.
Честно говоря не знаю, можно ли использовать в вызове g.DrawImage выражения, поэтому если не получится указать координаты так, то определить еще одну переменную int чуть раньше. Вот и все. Ну разве что Dispose для третьего битмапа в конце еще вставить...
 
  • Спасибо
Реакции: artur23 и juk88

juk88

Client
Регистрация
30.05.2018
Сообщения
90
Благодарностей
12
Баллы
8
Логика-то подскажет, куда она денется, но лучше самому попробовать - это ведь совсем не сложно.
Декларируем еще по одному string и bitmap, суммируем еще одну переменную с шириной третьего битмапа с первыми двумя. Вызываем еще один раз g.DrawImage указав новые координаты для третьей картинки.
Честно говоря не знаю, можно ли использовать в вызове g.DrawImage выражения, поэтому если не получится указать координаты так, то определить еще одну переменную int чуть раньше. Вот и все. Ну разве что Dispose для третьего битмапа в конце еще вставить...
Спасибо. Вы сейчас для меня столько незнакомых мне словеёв написали!
 

juk88

Client
Регистрация
30.05.2018
Сообщения
90
Благодарностей
12
Баллы
8
Как вместо этого:
string img1 = @"C:\image1.jpg";
Указать путь из переменной? Подскажите пожалуйста.
 

zortexx

Client
Регистрация
19.09.2011
Сообщения
2 520
Благодарностей
1 226
Баллы
113
Как вместо этого:
string img1 = @"C:\image1.jpg";
Указать путь из переменной? Подскажите пожалуйста.
Если путь определяется в шаблоне, то так:
C#:
string img1 = project.Variables["ImagePath"].Value;
 
  • Спасибо
Реакции: juk88

juk88

Client
Регистрация
30.05.2018
Сообщения
90
Благодарностей
12
Баллы
8
Если путь определяется в шаблоне, то так:
C#:
string img1 = project.Variables["ImagePath"].Value;
Спасибо. Картинка лежит в директории проекта, в подпапках. + к имени файла, добавляется цифра. Так будет правильно?
string img1 = (project.Directory + @"\profile\caps\" + project.Variables["Login"].Value + "10.jpg");
 

zortexx

Client
Регистрация
19.09.2011
Сообщения
2 520
Благодарностей
1 226
Баллы
113
Спасибо. Картинка лежит в директории проекта, в подпапках. + к имени файла, добавляется цифра. Так будет правильно?
string img1 = (project.Directory + @"\profile\caps\" + project.Variables["Login"].Value + "10.jpg");
Синтаксис верный. Только скобки уберите.
C#:
string img1 = project.Directory + @"\profile\caps\" + project.Variables["Login"].Value + "10.jpg";
 
  • Спасибо
Реакции: juk88

eee

Client
Регистрация
04.06.2018
Сообщения
134
Благодарностей
31
Баллы
28
Нубский код:
C#:
string img1 = @"C:\image1.jpg"; // Картинка раз
string img2 = @"C:\image2.jpg"; // Картинка два

Bitmap bm1 = new Bitmap(img1, true);
Bitmap bm2 = new Bitmap(img2, true);

int width = bm1.Width;
int height = bm1.Height + bm2.Height;

Bitmap bm = new Bitmap(width, height);

Graphics g = Graphics.FromImage(bm);
g.DrawImage(bm1, 0, 0, bm1.Width, bm1.Height);
g.DrawImage(bm2, 0, bm1.Height, bm2.Width, bm2.Height);

bm.Save(@"C:\newImage.jpg"); // Новая картинка

bm.Dispose();
bm1.Dispose();
bm2.Dispose();
ЗЫ. Картинки должны быть одинаковой ширины, а то будут белые пустоты.
а у меня выскакивает ошибка
"Выполнение действия CSharp OwnCode В GDI+ возникла ошибка общего вида." Итоговая картинка не появляется при этом
 

eee

Client
Регистрация
04.06.2018
Сообщения
134
Благодарностей
31
Баллы
28
Нубский код:
C#:
string img1 = @"C:\image1.jpg"; // Картинка раз
string img2 = @"C:\image2.jpg"; // Картинка два

Bitmap bm1 = new Bitmap(img1, true);
Bitmap bm2 = new Bitmap(img2, true);

int width = bm1.Width;
int height = bm1.Height + bm2.Height;

Bitmap bm = new Bitmap(width, height);

Graphics g = Graphics.FromImage(bm);
g.DrawImage(bm1, 0, 0, bm1.Width, bm1.Height);
g.DrawImage(bm2, 0, bm1.Height, bm2.Width, bm2.Height);

bm.Save(@"C:\newImage.jpg"); // Новая картинка

bm.Dispose();
bm1.Dispose();
bm2.Dispose();
ЗЫ. Картинки должны быть одинаковой ширины, а то будут белые пустоты.
Помогите пожалуйста. я совсем не разбираюсь в объявлении переменных. нужно переделать код ниже (который работает в PM, но не работает в ZP) правильно прописав переменные. Я заплачу 200 руб тому кто поможет
C#:
string img1 = @"{-Project.Directory-}\данные\1.png"; // Картинка 1
string img2 = @"{-Project.Directory-}\images\image1\{-Variable.qim1-}"; // Картинка 2

Bitmap bm1 = new Bitmap(img1, true);
Bitmap bm2 = new Bitmap(img2, true);

int width = bm1.Width;
int height = bm1.Height + bm2.Height;

Bitmap bm = new Bitmap(width, height);

Graphics g = Graphics.FromImage(bm);
g.DrawImage(bm1, 0, 0, bm1.Width, bm1.Height);
g.DrawImage(bm2, 0, bm1.Height, bm2.Width, bm2.Height);

bm.Save(@"{-Project.Directory-}\images\bufer\{-Variable.qim1-}"); // Новая картинка

bm.Dispose();
bm1.Dispose();
bm2.Dispose();
 

molotok

Client
Регистрация
17.04.2015
Сообщения
733
Благодарностей
358
Баллы
63
Помогите пожалуйста. я совсем не разбираюсь в объявлении переменных. нужно переделать код ниже (который работает в PM, но не работает в ZP) правильно прописав переменные. Я заплачу 200 руб тому кто поможет
C#:
string img1 = @"{-Project.Directory-}\данные\1.png"; // Картинка 1
string img2 = @"{-Project.Directory-}\images\image1\{-Variable.qim1-}"; // Картинка 2

Bitmap bm1 = new Bitmap(img1, true);
Bitmap bm2 = new Bitmap(img2, true);

int width = bm1.Width;
int height = bm1.Height + bm2.Height;

Bitmap bm = new Bitmap(width, height);

Graphics g = Graphics.FromImage(bm);
g.DrawImage(bm1, 0, 0, bm1.Width, bm1.Height);
g.DrawImage(bm2, 0, bm1.Height, bm2.Width, bm2.Height);

bm.Save(@"{-Project.Directory-}\images\bufer\{-Variable.qim1-}"); // Новая картинка

bm.Dispose();
bm1.Dispose();
bm2.Dispose();

Примерно так это должно выглядеть.
46956
 
  • Спасибо
Реакции: eee и artur23

eee

Client
Регистрация
04.06.2018
Сообщения
134
Благодарностей
31
Баллы
28
Большое спасибо! все работает!
 
  • Спасибо
Реакции: molotok

Khmer

Client
Регистрация
28.01.2020
Сообщения
12
Благодарностей
4
Баллы
3
Здравствуйте, кто-нибудь сможет помочь с таким вопросом?
Я беру первую картинку из переменной и хочу сохранить полученную склеенную картинку по адресу той же переменной, заменив первую картинку.
Все мои попытки окончились теми или иными ошибками. Заранее благодарен.
C#:
string img1 = @"{-Variable.photo-}"; // Картинка раз
string img2 = @"D:\ЧЕКЛИСТЫ\podstavka_pin.jpg"; // Картинка два

Bitmap bm1 = new Bitmap(img1, true);
Bitmap bm2 = new Bitmap(img2, true);

int width = bm1.Width;
int height = bm1.Height + bm2.Height;

Bitmap bm = new Bitmap(width, height);

Graphics g = Graphics.FromImage(bm);
g.DrawImage(bm1, 0, 0, bm1.Width, bm1.Height);
g.DrawImage(bm2, 0, bm1.Height, bm2.Width, bm2.Height);

bm.Save (@"C:\newImage.jpg"); // Новая картинка

bm.Dispose();
bm1.Dispose();
bm2.Dispose();
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
49362

это что ? 1 пост выше рабочий код на скриншоте же.

должно быть string img1 = project.Variables["photo"].Value;
 
Последнее редактирование:

Khmer

Client
Регистрация
28.01.2020
Сообщения
12
Благодарностей
4
Баллы
3

Khmer

Client
Регистрация
28.01.2020
Сообщения
12
Благодарностей
4
Баллы
3
Здравствуйте, кто-нибудь сможет помочь с таким вопросом?
Я беру первую картинку из переменной и хочу сохранить полученную склеенную картинку по адресу той же переменной, заменив первую картинку.
Все мои попытки окончились теми или иными ошибками. Заранее благодарен.
C#:
string img1 = @"{-Variable.photo-}"; // Картинка раз
string img2 = @"D:\ЧЕКЛИСТЫ\podstavka_pin.jpg"; // Картинка два

Bitmap bm1 = new Bitmap(img1, true);
Bitmap bm2 = new Bitmap(img2, true);

int width = bm1.Width;
int height = bm1.Height + bm2.Height;

Bitmap bm = new Bitmap(width, height);

Graphics g = Graphics.FromImage(bm);
g.DrawImage(bm1, 0, 0, bm1.Width, bm1.Height);
g.DrawImage(bm2, 0, bm1.Height, bm2.Width, bm2.Height);

bm.Save (@"C:\newImage.jpg"); // Новая картинка

bm.Dispose();
bm1.Dispose();
bm2.Dispose();
Решается этот вопрос следующим кодом


C#:
string img1 = project.Variables["photo"].Value; // Картинка раз
string img2 = @"D:\ЧЕКЛИСТЫ\podstavka_pin.jpg"; // Картинка два

Bitmap bm1 = new Bitmap(img1, true);
Bitmap bm2 = new Bitmap(img2, true);

int width = bm1.Width;
int height = bm1.Height + bm2.Height;

Bitmap bm = new Bitmap(width, height);

Graphics g = Graphics.FromImage(bm);
g.DrawImage(bm1, 0, 0, bm1.Width, bm1.Height);
g.DrawImage(bm2, 0, bm1.Height, bm2.Width, bm2.Height);

bm1.Dispose();
bm2.Dispose();

bm.Save(mg1); // Новая картинка

bm.Dispose();
Большое спасибо за решение
Dimionix
 

artur23

Client
Регистрация
14.04.2014
Сообщения
202
Благодарностей
15
Баллы
18
Логика-то подскажет, куда она денется, но лучше самому попробовать - это ведь совсем не сложно.
Декларируем еще по одному string и bitmap, суммируем еще одну переменную с шириной третьего битмапа с первыми двумя. Вызываем еще один раз g.DrawImage указав новые координаты для третьей картинки.
Честно говоря не знаю, можно ли использовать в вызове g.DrawImage выражения, поэтому если не получится указать координаты так, то определить еще одну переменную int чуть раньше. Вот и все. Ну разве что Dispose для третьего битмапа в конце еще вставить...
А подскажите, как именно это реализовать? Что-то не получается с 3-й даже картинкой все 3 соединить в одну. с двумя да, код работает.
 

eee

Client
Регистрация
04.06.2018
Сообщения
134
Благодарностей
31
Баллы
28
я тоже помучился с тремя, а потом пошел по пути поэтапного склеивания:
1) склеиваем картинки 1 и 2;
2) склеиваем то что получилось на первом этапе с третьей картинкой.
и нервы побережете и время
 
  • Спасибо
Реакции: artur23

artur23

Client
Регистрация
14.04.2014
Сообщения
202
Благодарностей
15
Баллы
18
я тоже помучился с тремя, а потом пошел по пути поэтапного склеивания:
1) склеиваем картинки 1 и 2;
2) склеиваем то что получилось на первом этапе с третьей картинкой.
и нервы побережете и время
понял, спасибо. хотел просто в 1 кубик все запихнуть.
 

KokaSEO

Client
Регистрация
17.01.2015
Сообщения
356
Благодарностей
141
Баллы
43
Подскажите пожалуйста, как подредактировать код, если картинки в base64
То есть нужно склеить 2 картинки, сохраненных в base64


C# не знаю, но по логике видимо так -

Код:
string img1 = @"C:\image1.jpg"; // Картинка раз
string img2 = @"C:\image2.jpg"; // Картинка два

Bitmap bm1 = new Bitmap(img1, true);
Bitmap bm2 = new Bitmap(img2, true);

int width = bm1.Width + bm2.Width;
int height = bm1.Height;

Bitmap bm = new Bitmap(width, height);

Graphics g = Graphics.FromImage(bm);
g.DrawImage(bm1, 0, 0, bm1.Width, bm1.Height);
g.DrawImage(bm2, bm1.Width, 0, bm2.Width, bm2.Height);

bm.Save(@"C:\newImage.jpg"); // Новая картинка

bm.Dispose();
bm1.Dispose();
bm2.Dispose();
 

Sirius123

Client
Регистрация
16.09.2017
Сообщения
43
Благодарностей
12
Баллы
8
Всем привет, кто подскажет как уменьшить размер полученного изображения? Получается 2 исходящих изображения по 100 кб, а склеенный результат 3,5 Мб
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)