Javascript-форум (https://javascript.ru/forum/)
-   Firefox/Mozilla (https://javascript.ru/forum/css-html-firefox-mizilla/)
-   -   Генерация изображений (https://javascript.ru/forum/css-html-firefox-mizilla/83645-generaciya-izobrazhenijj.html)

Борис К 03.02.2022 20:56

Генерация изображений
 
Привет, javascript-бродяги!))
Пожалуйста, подскажите, возможна ли в принципе генерация цельных изображений (jpg, gif, png) из нескольких изображений случайным образом средствами Java Script?
Спасибо!)

Aetae 03.02.2022 21:56

Да, на canvas. Анимированный гиф правда из коробки незя, но ставлю вчерашний йогурт, что есть нормальная библиотека под это дело.

Борис К 03.02.2022 22:11

Благодарю, Aetae!
Цитата:

Сообщение от Aetae
Анимированный гиф

Нет, просто чтобы несколько статичных изображений каждый раз случайным образом выводились в виде цельного изображения в jpg, gif или png.
Цитата:

Сообщение от Aetae
нормальная библиотека под это дело

Им. Ленина?))

Rise 04.02.2022 00:33

Борис К,
Надо примеры смотреть, картинки До, картинка После.

Борис К 04.02.2022 00:34

Aetae, вот такое нашёл здесь:
Вывести две img в одну img через canvas
Вот ещё бы изображения рандомно выстраивались каждый раз...

Борис К 04.02.2022 00:41

Rise, например, изображения До:
<img src="http://placehold.it/150x150/ff0000/ff0000">
<img src="http://placehold.it/150x150/ffff00/ffff00">
<img src="http://placehold.it/150x150/0000ff/0000ff">
<img src="http://placehold.it/150x150/00ff00/00ff00">

Изображение После, как случайная комбинация из представленных выше изображений.

Rise 04.02.2022 00:51

Цитата:

Сообщение от Борис К
как случайная комбинация

В ряд или как, ну чел?

Aetae 04.02.2022 01:03

Цитата:

В ряд или как, ну чел?
+1

Борис К, "случайных комбинаций" может быть бесконечное количество: и вдоль и поперёк, и по диагонали, и наложением и через фильтры всякие и т.д. и т.п.
Конкретный пример нужен, да с описанием.

Борис К 04.02.2022 01:12

Rise, сорри))
Нет, 2 на 2 (или 3 на 3 при большем количестве разных изображений и т.д.)
Например, такой вид:
<table>
  <tr>
    <td><img src="http://placehold.it/50x50/ff0000/ff0000"></td>
    <td><img src="http://placehold.it/50x50/ffff00/ffff00"></td>
    <td><img src="http://placehold.it/50x50/0000ff/0000ff"></td>
  </tr>
  <tr>
    <td><img src="http://placehold.it/50x50/00ff00/00ff00"></td>
    <td><img src="http://placehold.it/50x50/006600/006600"></td>
     <td><img src="http://placehold.it/50x50/ddff00/ddff00"></td>
  </tr>
  <tr>
    <td><img src="http://placehold.it/50x50/00ffdd/00ffdd"></td>
    <td><img src="http://placehold.it/50x50/800000/800000"></td>
    <td><img src="http://placehold.it/50x50/f09900/f09900"></td>
  </tr>
</table>

Борис К 04.02.2022 01:31

Aetae, каждый раз при загрузке странички должно быть сгенерировано изображение в jpg, gif или png, состоящее из других изображений, которые расположились абсолютно случайным образом, как я представил выше для Rise... извините, если сразу непонятно объясняю((

Aetae 04.02.2022 02:04

https://jsfiddle.net/3oj924aq/

Борис К 04.02.2022 04:57

Aetae, отличная работа!))
Только сгенерированное изображение почему-то отображается аж три раза... как бы это поправить?

рони 04.02.2022 08:06

Цитата:

Сообщение от Борис К
отображается аж три раза...

долго думать над строкой 58 и в частности строками 59 - 60 в блоке js, можно конечно и пораньше задуматься со строки 46 например.)))

рони 04.02.2022 08:15

Aetae,
:thanks:

рони 04.02.2022 08:18

Цитата:

Сообщение от Борис К
src="http:

ссылки без S лучше не использовать в примерах на форуме, картинки не отобразятся, скрипты не загрузятся с такими url.

Aetae 04.02.2022 13:01

Борис К, поправил shuffle, там был баг - он не трогал последнюю картинку.)

Борис К 04.02.2022 13:41

Спасибо, Рони!
Цитата:

Сообщение от рони
долго думать над строкой 58 и в частности строками 59 - 60

Тут уже вроде сообразил... после бессонной ночи)
Цитата:

Сообщение от рони
можно конечно и пораньше задуматься со строки 46 например.)))

Видимо, с этим будет посложнее... но я непременно последую вашему совету!))
Цитата:

Сообщение от рони
ссылки без S лучше не использовать в примерах на форуме

Спасибо за подсказку!
Цитата:

Сообщение от рони
картинки не отобразятся, скрипты не загрузятся с такими url

Но у меня всё отлично отображается, загружаясь... честное слово!))
Видимо, у меня ещё старый браузер... такое может быть?

Борис К 04.02.2022 14:08

Цитата:

Сообщение от Aetae
поправил shuffle, там был баг

Ничего, бывает в спешке... Вы и так мгновенно реализовали мою фантазию)))
Цитата:

Сообщение от Aetae
он не трогал последнюю картинку.)

Да, я заметил такое дело))
Спасибо, Aetae!
P.S. Но ещё вопрос родился: возможно ли сделать ещё кнопку перемешивания для генерации нового изображения, чтобы не перезагружать страницу, или это слишком трудоёмко?
<button onclick="...">Shuffle</button>

Самостоятельно разобраться пока не смог((

рони 04.02.2022 14:47

canvas create img
 
Борис К,
:-?
<!DOCTYPE html>

<html>
<head>
    <title>Untitled</title>
    <meta charset="utf-8">
</head>

<body>
<img id="pic"></img>
<button id="btn">Shuffle</button>

<script>
   // функция перемешивающая массив
function shuffle(array) {
    let i = array.length;
    while (i--) {
        let j = Math.floor(Math.random() * (i + 1));
        [array[i], array[j]] = [array[j], array[i]];
    }
    return array;
}

// функция добавляющая картинку на страницу
function toImage(canvas, type) {
        pic.src = canvas.toDataURL(type)
}

const x = 150; // ширина одного
const y = 150; // высота одного
const w = 2; // сколько в ряду

// картинки, должны быть на том же домене или иметь Access-Control-Allow-Origin
const images = [
    "https://picsum.photos/seed/aaa/150",
    "https://picsum.photos/seed/bbb/150",
    "https://picsum.photos/seed/ccc/150",
    "https://picsum.photos/seed/ddd/150"
];

const h = Math.ceil(images.length / w); // сколько в столбце

const canvas = Object.assign(document.createElement('canvas'), {
    width: w * x,
    height: h * y
});
const ctx = canvas.getContext('2d');

const createImg = () => Promise.all(
    shuffle(images).map((src, i) => new Promise(
        (onload, onerror) => Object.assign(new Image(), {
            crossOrigin: 'anonymous',
            src,
            onerror,
            onload
        })
    ).then(({target}) => {
        const hPos = Math.floor(i / w);
        const wPos = i - (hPos * w);

        ctx.drawImage(
            target,
            wPos * x,
            hPos * y,
            x,
            y
        )
    }))
).then(() => {
    toImage(canvas, 'image/jpeg');
});

btn.addEventListener('click', createImg);
createImg()
</script>
</body>
</html>

Борис К 04.02.2022 15:12

Рони... так ничесна!))
Я не поспеваю за Вами... учица новому! :write:
Огромная благодарность Богам Java Script!
:victory:

Борис К 06.02.2022 03:51

Aetae, Рони, тока не кидайте в меня тэгами тапками в это морозное воскресное утро! :stop:
Но возможно ли в принципе сделать так, чтобы в последнем коде на этой страничке 10-я строка (<img id="pic"></img>) была заменена следующей таблицей с отправкой к стилям?
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <style type="text/css">
        [data-id="1"] {
            background-image:url(...);
   width:150px;
   height:150px;
   background-position:0px 0px
}
        [data-id="2"] {
            background-image:url(...);
   width:150px;
   height:150px;
   background-position:150px 300px
}
        [data-id="3"] {
            background-image:url(...);
   width:150px;
   height:150px;
   background-position:0px 150px
}
        [data-id="4"] {
            background-image:url(...);
   width:150px;
   height:150px;
   background-position:150px 150px
}
    </style>
</head>
<body>
        <table align="center" cellspacing="0" cellpadding="0">
            <tr>
                <td data-id="1"></td>
                <td data-id="2"></td>
            </tr>
            <tr>
                <td data-id="3"></td>
                <td data-id="4"></td>
            </tr>
        </table>
</body>
</html>

:help:

рони 06.02.2022 08:12

Борис К,
вопрос не понимаю, нафига тогда огород с канвас городили, если вернулись к тому что было?

Борис К 06.02.2022 12:25

Рони, на первый взгляд, видимо, может показаться, что затея "огород с канвас" бессмысленна, но дело меняется, если посмотреть на таблицу, например, с большим количеством ячеек, которыми в дальнейшем можно интерактивно манипулировать.
Если это очень сложно реализовать, ну, тогда...
В любом случае представленное решение на мой первый вопрос несомненно очень кстати, супер... Спасибо огромное!

рони 06.02.2022 13:46

Цитата:

Сообщение от Борис К
Если это очень сложно реализовать, ну, тогда...

Цитата:

Сообщение от Борис К
Но возможно ли в принципе сделать так,

... ещё бы знать, о чём это?)))

Борис К 06.02.2022 17:34

Рони, возможно, я слишком туманно изьясняюсь... уж извините!)
Смотрите, например, из 16-ти маленьких исходных изображений можно сгенерировать одно большое, которое отражается в <img id="pic"></img>, что и было уже Вами представлено в конечном результате - просто отлично получилось!
Теперь это изображение нужно как-то представить, например, девятью ячейками таблицы, чтобы в дальнейшем можно было их перемещать кликами между собой после рандомной перетасовки до первоначально сгенерированного вида.
Очень жаль, если такое невозможно реализовать(((
Хотя мне казалось, что средствами Java Script невозможно и картинку сгенерировать из других... и, о, чудо чудесное! :dance:

voraa 06.02.2022 19:42

Цитата:

Сообщение от Борис К
Очень жаль, если такое невозможно реализовать(((

Все можно.
Переделал слегка пример Рони
Вверху canvas. Внизу таблица с перенесенным в ячейки изображение из канвас
<!DOCTYPE html>
 
<html>
<head>
    <title>Untitled</title>
    <meta charset="utf-8">
<style type="text/css">
   td {
   width:100px;
   height:100px;
}
</style>
</head>
 
<body>
<br>
<br>
<table>
	<tr>
		<td></td><td></td><td></td>
	</tr>
	<tr>
		<td></td><td></td><td></td>
	</tr>
	<tr>
		<td></td><td></td><td></td>
	</tr>
</table>
<button id="btn">Shuffle</button>
 
<script>
   // функция перемешивающая массив
function shuffle(array) {
    let i = array.length;
    while (i--) {
        let j = Math.floor(Math.random() * (i + 1));
        [array[i], array[j]] = [array[j], array[i]];
    }
    return array;
}
 
// функция добавляющая картинку на страницу
function toImage(canvas, type) {
        pic.src = canvas.toDataURL(type)
}
 
const x = 150; // ширина одного
const y = 150; // высота одного
const w = 2; // сколько в ряду
 
// картинки, должны быть на том же домене или иметь Access-Control-Allow-Origin
const images = [
    "https://picsum.photos/seed/aaa/150",
    "https://picsum.photos/seed/bbb/150",
    "https://picsum.photos/seed/ccc/150",
    "https://picsum.photos/seed/ddd/150"
];
 
const h = Math.ceil(images.length / w); // сколько в столбце
 
const canvas = Object.assign(document.createElement('canvas'), {
    width: w * x,
    height: h * y
});

document.body.prepend(canvas);

const ctx = canvas.getContext('2d');
 
const createImg = () => Promise.all(
    shuffle(images).map((src, i) => new Promise(
        (onload, onerror) => Object.assign(new Image(), {
            crossOrigin: 'anonymous',
            src,
            onerror,
            onload
        })
    ).then(({target}) => {
        const hPos = Math.floor(i / w);
        const wPos = i - (hPos * w);
 
        ctx.drawImage(
            target,
            wPos * x,
            hPos * y,
            x,
            y
        )
    }))
).then(() => {
//    toImage(canvas, 'image/jpeg');
const url = canvas.toDataURL('image/jpeg')
    let x =0;
    const tb = document.querySelector ('table')
    for (let i = 0; i< tb.rows.length; i++) {
		for (let j = 0; j< tb.rows[i].cells.length; j++) {
			tb.rows[i].cells[j].style.backgroundImage = `url(${url})`;
			tb.rows[i].cells[j].style.backgroundPosition = `${-j*100}px ${-i*100}px`;
		}
    }
});
 
btn.addEventListener('click', createImg);
createImg()
</script>
</body>
</html>

Rise 06.02.2022 20:36

Цитата:

Сообщение от Борис К
из 16-ти маленьких исходных изображений

Цитата:

Сообщение от Борис К
представить, например, девятью ячейками таблицы

Чел, что с логикой, как 16 стало 9? Чекни мой пазл лучше, без канвас и таблиц, чисто на дивах, реально.

Борис К 06.02.2022 21:49

Цитата:

Сообщение от Rise
Чел, что с логикой, как 16 стало 9?

:cray:
Да нет, всё логично по задумке - выше Voraa вроде правильно понял...
Поясню:
1. Из 16 маленьких изображений генерируется одно большое изображение цельным jpg (это уже реализовано - представлено Aetae и модифицировано Рони).
2. Одновременно большое изображение должно разделится, например, на 9 частей-квадратиков (Voraa разделил) и перемешатся .
3. Клики по соседним квадратикам должны их менять местами... и так до результата первоначально сгенерированного большого изображения.
Цитата:

Сообщение от Rise
Чекни мой пазл лучше, без канвас и таблиц, чисто на дивах, реально.

За пазл без jQuery, конечно, спасибо! Очень интересное решение)))

Борис К 06.02.2022 22:02

Voraa, Вы правильно поняли мой вопрос и отлично справились, но немного изменили код в моём примере на этой страничке, а это мне помешает самостоятельно реализовать то, что уже имелось для полного замысла... но тем не менее моя Вам искренняя благодарность!))
Поясню своё полное видение:
1. Из 16 маленьких изображений генерируется одно большое изображение цельным jpg (это уже реализовано - представлено Aetae и модифицировано Рони).
2. Одновременно большое изображение должно разделится, например, на 9 частей-квадратиков (реализовано Вами) и перемешатся (имеется уже готовое решение).
3. Клики по соседним квадратикам должны их менять местами... и так до результата первоначально сгенерированного большого изображения.

voraa 07.02.2022 07:15

Цитата:

Сообщение от Борис К
Поясню своё полное видение:

Вам дали подсказки.
Как из нескольких изображений сделать одно.
Как снова разделить это изображение на другое количество частей и вставить их как фон на элементы.

Ваше видение вы должны сами реализовывать.

Борис К 07.02.2022 14:20

Цитата:

Сообщение от voraa
Вам дали подсказки.

Да, и я искренне благодарен абсолютно всем за них... огромное спасибо!
Цитата:

Сообщение от voraa
Как из нескольких изображений сделать одно.

Без сомнений я получил отличное готовое решение!
Цитата:

Сообщение от voraa
Как снова разделить это изображение на другое количество частей и вставить их как фон на элементы.

Потом зародилась и такая мысль))
Цитата:

Сообщение от voraa
Ваше видение вы должны сами реализовывать.

К сожалению, я очень далёк от программирования, но я буду по мере своих возможностей разбираться...
Voraa, спасибо Вам!

Rise 07.02.2022 18:18

Борис К,
А что это за игра?

Борис К 07.02.2022 19:49

Rise, это пока не игра... ведь решение мной так и не найдено(((
А так, то был замысел сделать что-нибудь среднее по трудности для умственно отсталого ребенка на компьютере...
P.S. Я совсем не программист, просто когда-то немного знакомился с веб-технологиями в качестве хобби, но теперь вижу, что язык JS в составе HTML5 ушёл далеко вперёд... и я глубоко восхищён высокопрофессионализмом людей на этом ресурсе, владеющим современным JS!

voraa 07.02.2022 20:10

А почему обязательно на компьютере?
Разве "материальные" игры, игрушки, головоломки хуже?
Я немного знаю о чем говорю, т.к. моя жена всю жизнь проработала психологом в психиатрической больнице (правда не с детьми).
Им необходим не столько компьютер, сколько доступная активность для мозга, моторика для рук, общение...

Борис К 07.02.2022 20:32

Voraa, Вы абсолютно без сомнений правы во всём!
Но просто, как дополнение к основному, на компьютере можно создавать бесконечное количество наглядного материала... да и по правде, мне самому интересно повозиться с кодом, но у меня, к сожалению, очень ограниченный объем знаний(((
Порой радуюсь, как дитя малое, что удалось что-нибудь "модифицировать" самостоятельно из чужого... повторюсь, я глубоко восхищён возможностями JS! Но я далеко немолод и нездоров, чтобы достаточно хорошо освоить этот замечательный стремительно развивающийся язык(((
Хотя всё же жизнь продолжается и я не теряю надежд на лучшее - вот на неделе скачал современные книги по JS)))
Voraa, спасибо Вам за добрые слова!

рони 07.02.2022 23:11

Цитата:

Сообщение от Rise
А что это за игра?

https://javascript.ru/forum/css-html...tml#post543102

только надо добавить это

https://javascript.ru/forum/css-html...tml#post543513

Rise 08.02.2022 00:15

рони,
Судя по той и этой теме, автор так и не определился окончательно что ему нужно.

Борис К 08.02.2022 00:49

Цитата:

Сообщение от Rise
Судя по той и этой теме, автор так и не определился окончательно что ему нужно.

Rise, моё окончательное видение:
Изображение, которое сначала генерируется, например, из 16 маленьких изображений, автоматически делится на 9 сегментов, которые рандомно перемешиваются, и их необходимо кликами по соседним привести в исходное положение, как на первоначально сгенерированной картинке:

Извините, если невразумительно объясняю((

Борис К 08.02.2022 01:29

Рони, сначала генерация изображения, как было продемонстрировано Вами в этой теме:
https://javascript.ru/forum/css-html...tml#post543474
Потом раздел на сегменты, как на изображении для Rise выше, затем ваша же реализация перемещения разделённых сегментов в другой моей теме:
https://javascript.ru/forum/css-html...tml#post542829
P.S. Предупреждал не кидать в меня тапками!))

Rise 08.02.2022 03:15

Борис К,
А активный сегмент какой?


Часовой пояс GMT +3, время: 21:11.