Jak pracovat s AI generátorem obrázků, který Microsoft přidal do prohlížeče Edge

24. 4. 2023

Sdílet

Je tomu jen několik dnů, co generátor obrázků Microsoft Bing dorazil také přímo do internetového prohlížeče Edge. Vyzkoušeli jsme, jaké výsledky nabízí. Výhodou je rychlejší přístup k obrázkům, třeba u konkurenčního Midjourney je ovládání složitější.

Využívání implementovaného generátoru nazvaného Bing Image Creator, který využívá technologii DALL-E, není nic složitého. K tomu, abyste si ho vyzkoušeli, vám stačí pouze účet od Microsoftu. Přesto jsou tam určitá úskalí, proto vám přinášíme přehledný návod.

Novou funkci v Edge si třeba třeba nejdříve aktivovat, a to kliknutím na plusko v pravém panelu, načež v rozbalené nabídce vybereme „Image Creator“. Tím do lišty přidáme ikonu odkazující na novou funkci, na kterou již stačí jednoduše kliknout.

Image Creator otevřený v panelu prohlížeče Edge má nicméně k dispozici poměrně omezený prostor, a pro lepší uživatelský zážitek tak doporučujeme využít spíše oficiální stránkuNa té jsme ostatně generátor obrázků testovali i my, a vy se nyní můžete podívat, jak dobře si tahle novinka Bingu vlastně vedla.

Do pole pro klíčová slova můžeme zadat podstatná nebo přídavná jména, slovesa i specifický umělecký styl (geometric art, retro, digital art, pop art…). Bing následně vytvoří čtyři obrázky, přičemž na zpracování mu postačí jen několik vteřin. Za rychlé zhotovení nicméně platíme virtuální měnou, oficiálně nazvanou „vylepšení“. Jakmile nám vylepšení dojdou, doba generování obrázků se mírně prodlouží, a to zhruba na 30 vteřin.

Konečná kvalita obrázků závisí na konkrétním tématu. V některých oblastech pro nás Bing připravil dechberoucí díla, ať už šlo o válečné scény, bojovníky, živočichy, města, strašidelné postavy, sci-fi záležitosti, loga nebo ikony nejrůznějšího charakteru. Veškeré tyto snímky bychom mohli použít i v profesionálních pracích (ale nemůžeme, protože je to omezené licenčně, viz další text).

V jiných okruzích nicméně generování obrázků značně pokulhávalo. Šlo zejména o tvorbu fotorealistických lidských obličejů, prstů na rukou a v některých případech byly problémy také s chrupem. Výsledné deformace přitom nebyly jen nepřirozené, ale vysloveně odpuzující a ve výsledku tak zcela nepoužitelné. Při tvorbě herních a filmových postav byla celková atmosféra sice správná, vyprodukované postavy ale nikoho z daného díla nepřipomínaly.

Zcela znemožněno je generování obrázků s násilnou nebo lechtivou tématikou, stejně jako nelze vytvářet snímky s celosvětově známými osobnostmi (politiky, celebritami…). Toto omezení se netýká některých českých celebrit, které vývojáři zřejmě neznají, a proto je do zakázaných klíčových slov (zatím) nezařadili. Ani v jejich případě nicméně podoba vytvořené postavy neodpovídala reálné předloze.

Jeden z nepříliš povedených obrázků z Image Creatoru.

Pro úplnost dodejme, že vytvořená díla zpravidla mají čtvercový tvar, formát JPG, rozlišení 1024 × 1024 px a vodoznak v levém dolním rohu. Tyto parametry v současné době nelze měnit. Klíčová slova zároveň musí být v angličtině a výsledky je možné využít jen v rámci nekomerčního využití. Obrázky si nicméně velmi rychle a jednoduše můžete stáhnout.

prace_s_linuxem_tip

Generátor v některých věcech působí jako chudý příbuzný populárního Midjourney. Ten umožňuje měnit třeba výstupní formát u vytvořeného obrázku. Jeho nová verze zároveň přináší výrazně přirozenější výstupy. Na druhou stranu se ale zase hůře ovládá.

Printscreeny v textu vytvořila redakce PCWorld.

'; document.getElementById('preroll-iframe').onload = function () { setupIframe(); } prerollContainer = document.getElementsByClassName('preroll-container-iframe')[0]; } function setupIframe() { prerollDocument = document.getElementById('preroll-iframe').contentWindow.document; let el = prerollDocument.createElement('style'); prerollDocument.head.appendChild(el); el.innerText = "#adContainer>div:nth-of-type(1),#adContainer>div:nth-of-type(1) > iframe { width: 99% !important;height: 99% !important;max-width: 100%;}#videoContent,body{ width:100vw;height:100vh}body{ font-family:'Helvetica Neue',Arial,sans-serif}#videoContent{ overflow:hidden;background:#000}#adMuteBtn{ width:35px;height:35px;border:0;background:0 0;display:none;position:absolute;fill:rgba(230,230,230,1);bottom:20px;right:25px}"; videoContent = prerollDocument.getElementById('contentElement'); videoContent.style.display = 'none'; videoContent.volume = 1; videoContent.muted = false; const playPromise = videoContent.play(); if (playPromise !== undefined) { playPromise.then(function () { console.log('PREROLL sound allowed'); // setUpIMA(true); videoContent.volume = 1; videoContent.muted = false; setUpIMA(); }).catch(function () { console.log('PREROLL sound forbidden'); videoContent.volume = 0; videoContent.muted = true; setUpIMA(); }); } } function setupDimensions() { prerollWidth = Math.min(iinfoPrerollPosition.offsetWidth, 480); prerollHeight = Math.min(iinfoPrerollPosition.offsetHeight, 320); } function setUpIMA() { google.ima.settings.setDisableCustomPlaybackForIOS10Plus(true); google.ima.settings.setLocale('cs'); google.ima.settings.setNumRedirects(10); // Create the ad display container. createAdDisplayContainer(); // Create ads loader. adsLoader = new google.ima.AdsLoader(adDisplayContainer); // Listen and respond to ads loaded and error events. adsLoader.addEventListener( google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, onAdsManagerLoaded, false); adsLoader.addEventListener( google.ima.AdErrorEvent.Type.AD_ERROR, onAdError, false); // An event listener to tell the SDK that our content video // is completed so the SDK can play any post-roll ads. const contentEndedListener = function () { adsLoader.contentComplete(); }; videoContent.onended = contentEndedListener; // Request video ads. const adsRequest = new google.ima.AdsRequest(); adsRequest.adTagUrl = iinfoVastUrls[iinfoVastUrlIndex]; console.log('Preroll advert: ' + iinfoVastUrls[iinfoVastUrlIndex]); videoContent.muted = false; videoContent.volume = 1; // Specify the linear and nonlinear slot sizes. This helps the SDK to // select the correct creative if multiple are returned. // adsRequest.linearAdSlotWidth = prerollWidth; // adsRequest.linearAdSlotHeight = prerollHeight; adsRequest.nonLinearAdSlotWidth = 0; adsRequest.nonLinearAdSlotHeight = 0; adsLoader.requestAds(adsRequest); } function createAdDisplayContainer() { // We assume the adContainer is the DOM id of the element that will house // the ads. prerollDocument.getElementById('videoContent').style.display = 'none'; adDisplayContainer = new google.ima.AdDisplayContainer( prerollDocument.getElementById('adContainer'), videoContent); } function unmutePrerollAdvert() { adVolume = !adVolume; if (adVolume) { adsManager.setVolume(0.3); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } else { adsManager.setVolume(0); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } } function onAdsManagerLoaded(adsManagerLoadedEvent) { // Get the ads manager. const adsRenderingSettings = new google.ima.AdsRenderingSettings(); adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true; adsRenderingSettings.loadVideoTimeout = 12000; // videoContent should be set to the content video element. adsManager = adsManagerLoadedEvent.getAdsManager(videoContent, adsRenderingSettings); // Add listeners to the required events. adsManager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, onContentPauseRequested); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, onContentResumeRequested); adsManager.addEventListener( google.ima.AdEvent.Type.ALL_ADS_COMPLETED, onAdEvent); // Listen to any additional events, if necessary. adsManager.addEventListener(google.ima.AdEvent.Type.LOADED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.STARTED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.COMPLETE, onAdEvent); playAds(); } function playAds() { // Initialize the container. Must be done through a user action on mobile // devices. videoContent.load(); adDisplayContainer.initialize(); // setupDimensions(); try { // Initialize the ads manager. Ad rules playlist will start at this time. adsManager.init(1920, 1080, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will // start at this time; the call will be ignored for ad rules. adsManager.start(); // window.addEventListener('resize', function (event) { // if (adsManager) { // setupDimensions(); // adsManager.resize(prerollWidth, prerollHeight, google.ima.ViewMode.NORMAL); // } // }); } catch (adError) { // An error may be thrown if there was a problem with the VAST response. // videoContent.play(); } } function onAdEvent(adEvent) { const ad = adEvent.getAd(); console.log('Preroll event: ' + adEvent.type); switch (adEvent.type) { case google.ima.AdEvent.Type.LOADED: if (!ad.isLinear()) { videoContent.play(); } prerollDocument.getElementById('adContainer').style.width = '100%'; prerollDocument.getElementById('adContainer').style.maxWidth = '640px'; prerollDocument.getElementById('adContainer').style.height = '360px'; break; case google.ima.AdEvent.Type.STARTED: window.addEventListener('scroll', onActiveView); if (ad.isLinear()) { intervalTimer = setInterval( function () { // Example: const remainingTime = adsManager.getRemainingTime(); // adsManager.pause(); }, 300); // every 300ms } prerollDocument.getElementById('adMuteBtn').style.display = 'block'; break; case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: if (ad.isLinear()) { clearInterval(intervalTimer); } if (prerollLastError === 303) { playYtVideo(); } break; case google.ima.AdEvent.Type.COMPLETE: if (ad.isLinear()) { clearInterval(intervalTimer); } playYtVideo(); break; } } function onAdError(adErrorEvent) { console.log(adErrorEvent.getError()); prerollLastError = adErrorEvent.getError().getErrorCode(); if (!loadNext()) { playYtVideo(); } } function loadNext() { iinfoVastUrlIndex++; if (iinfoVastUrlIndex < iinfoVastUrls.length) { iinfoPrerollPosition.remove(); playPrerollAd(); } else { return false; } adVolume = 1; return true; } function onContentPauseRequested() { videoContent.pause(); } function onContentResumeRequested() { videoContent.play(); } function onActiveView() { if (prerollContainer) { const containerOffset = prerollContainer.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight/1 && containerOffset.bottom > 0.0) { if (prerollPaused) { adsManager.resume(); prerollPaused = false; } return true; } else { if (!prerollPaused) { adsManager.pause(); prerollPaused = true; } } } return false; } function playYtVideo() { iinfoPrerollPosition.remove(); youtubeIframe.style.display = 'block'; youtubeIframe.src += '&autoplay=1&mute=1'; } }
OSZAR »