3D TV distribution formats and applications 7 [307536]

Cuprins

3D TV distribution formats and applications 7

Tile Format 8

Planificarea activității 13

Stadiul actual 15

1.Fundamentare teoretică 19

1.1 Tile Format: un nou cadru pentru abordarea transmisiei video 3D 19

1.1.1 Descriere Tile Format 19

1.2 Calitatea imaginii Tile Format 22

1.2.1 Efectul de interpolare 22

1.2.2 Efectul de compresie 23

1.3 Transmisiunea cu Tile Format (TF) 25

1.4 Evaluarea rezoluției 27

1.4.1 Rezoluția pe verticală 27

1.4.2 Rezoluția pe orizontală 28

2. Implementarea soluției adoptate 29

2.1 Implementarea formatului Tile 3D 29

2.1.1 Descrierea formatului Tile 3D 29

2.1.2 Structura formatului Tile 3D 30

2.1.3 Descrierea formatului Tile 3DZ 32

2.2 Evaluarea rezoluției H & V imaginiilor TV 3D 34

2.2.1 3D Side-by-Side 720p/50 35

2.2.2 3D Side-by-Side 1080i/25 35

2.2.3 3D Side-by-Side 1080p/50 35

2.2.4 3D Top-and-Bottom 720p/50 36

2.2.5 3D Top-and-Bottom 1080i/25 36

2.2.6 3D Top-and-Bottom 1080p/50 37

2.2.7 3D Tile Format 1080p/50 37

2.3 Standarde HDTV 38

2.3.1 Standardul 720p 40

2.3.2 Standardul 1080i 40

2.3.3 Standardul 1080p 40

2.4 O metodă de a transforma un cadru compatibil 3D AVC (Codare Video Avansată) / H.264 într-o imagine compatibilă cu serviciul 2D 41

2.5 Conversia formatului Tile 3D în format de împachetare a cadrelor HDMI 42

2.5.1 Transmiterea semnalului 3D pe televizor: 43

2.5.2 Side-by-Side orizontal 44

2.5.3 Top and Bottom vertical 44

3. Rezultate experimentale 46

3.2 Structura proiectului 46

3.3 Interfața aplicației 47

3.4 Componentele aplicației Android 49

3.4.1 Activitatea Gallery 49

3.4.2 Activitatea Confirm 50

4.Concluzie 57

5.Bibliografie 59

6. Anexe 60

7.CV-ul autorului 81

Listă figuri

3D TV distribution formats and applications

Deploying 3D TV is also based on increasing resolution in capture and playback. [anonimizat]-high-definition (UHDTV) [anonimizat] (SHDTV) ultra-high definition variants. [anonimizat]-high-definition television (UHDTV), also known as TV-4K, has a resolution of 3840×2160 pixels per frame. [anonimizat]'s space.

DVB (Digital Video Broadcasting) is an industrial grouping of the world's [anonimizat], [anonimizat], who are committed to developing technical standards open for the provision of digital television and other broadcast services.

In the last period or at least in the last year, 3D televisions have had a considerable or substantial impact on the consumer market. If, [anonimizat] a [anonimizat] 3D televisions, [anonimizat] 3D television systems into a widespread technology that is available on the consumer market.

In this concept, a solution or a key role is played by 3D television technologies that are represented by compression and distribution technologies.

[anonimizat] a smooth transition from 2D to 3D TVs, while reusing most of the infrastructure that is already installed and the equipment used by the user. [anonimizat]-[anonimizat], and the best known are top-bottom, side-by-side (SbS) approaches where the two views of a stereoscopic video are aranajte in a single frame, but with the disadvantage of reducing the spatial resolution.

All HD-compatible and application-compatible formats require a significant 1080p image resolution. The top-and-bottom approach (Tab) splits the number of rows that fit the two stereo images into a single 1080p image in half. The same happens on columns using a side by side arrangement (SbS).

Today, new techniques have been adopted that are similar to those of a 3D-compatible TV frame:

Side-by-Side (SBS) = left and right images are placed side by side in 720p or 1080i HD. This requires a horizontal compression of the video signal that is halved horizontally.

Figura 1. Side-by-Side

Top-and-Bottom (TAB) = the left and right images are placed one above the other in the 720p or 1080i HD. Here, vertical compression of the video signal that is halfway vertically is required.

Figura 2. Top-and-Bottom

3D-Tile Format = Two 720p (left and right) images are arranged in a single 1080p frame by inserting an unchanged 720p image that does not require any reduction while dividing the other 720p image into three parts and remapping pixel location without filter / decimation.

Tile Format

Another viable explanation for frames is called Tile Format (TF), which so far has received less attention from the scientific community. However, Tile Format has some potential advantages in terms of image quality and compatibility, but still worth investigating.

Tile Format is a frame-compatible solution that allows two 1280 × 720 images (left and right view of a stereoscopic video) to be arranged in a 1920 × 1080 photo using a suitable Tile format.

The Tile Format specification is graphically represented in Figure 3: The left view, which occupies the upper left corner of the 1080 image, while the right view is divided into three regions that are arranged according to the strategy shown in the figure.

At the transmitter level, the 720p stereo video is hidden in a 2D 1080p format on the receiver side, Tile Format can be unveiled on a 2D 720p video by simply defining a cropping rectangle that selects only the left view.

Figure 3. Tile Format Specifications

Tile Format (TF) does not change the aspect ratio of the image, but requires sub-sampling of 1.5 in both directions (from 1080p to 720p). Performance in terms of end-user image quality terms clearly depends on two factors, namely the interpolated High Definition TV (HD TV) quality that is recovered from frames and video compression-compatible formats.

In particular, both interpolation and AVC / H.264 coding effects are analyzed

(Advanced Video Encoding) or 3D Tile Format (TF) video compression H.264. Secondly, we'll describe how Tile Format (TF) is used to broadcast 3D video on an existing Digital Video Broadcasting Infrastructure.

Tile Format Transmission (TF)

As already mentioned, the major advantage of Tile Format (TF) is compatibility with a High Definition TV (HD TV) television chain that is already implemented. The purpose of this study is to demonstrate the feasibility of blending 2D and 3D content into a single channel. Using Tile Format (TF) allows distribution over an already existing HD infrastructure; the (2D) format compatibility allows smoothly targeting 2D and 3D users with just one content.

This is particularly relevant because emission channels are a limited resource and the high cost makes the 2D version simulcasting and the stereoscopic version of the same content impossible for most operators.

3D Tile format

Stereoscopy, called "stereoscopics" or 3D images, is a technique for creating or enhancing the depth illusion in an image through stereoscopy for a binocular view. The process of stereophobia creates the illusion of three dimensional space (depth) on a two-dimensional plane.

Steroskopic perception allows the observer to distinguish more detail of objects and can thus receive much more information about objects in space, with the statement that they are the result of the analysis of the two images in the brain that are trained from the first visual perceptions.

Steroskopic perception allows the observer to distinguish more detail of objects and can thus receive much more information about objects in space, with the statement that they are the result of the analysis of the two images in the brain that are trained from the first visual perceptions.

The idea behind the 3D movie is to transmit two separate images (left and right) to reproduce the human stereoscopic vision packed in a single stream.

The challenge for service providers is that 3D transmissions be backward compatible so that the same infrastructure can be used for both 2D and 3D content.

The 3D Tile Format uses a series of algorithms that divide the second 3D image into three parts, placing it on the right and below the image for the other eye, and the result is compressed into H.264 and then transmitted, along with the first image, into a single HD frame.

The structure of the 3D Tile format

3D Tile Format is a frame-compatible format that allows you to store two 720p frames in a single 1080p frame.

In this case, if the L and R images originate in the 720p format, no decimation is required, and the reconstructed L and R images will retain their initial resolution and will not suffer imbalance in the vertical and horizontal resolution.

Additionally, because one of the two images remains unchanged, the resulting format may also be compatible with the service.

As illustrated in Figure 4, the first 720p frame (in the example) is inserted unmodified within the 1080p frame.

Figura 4. Framing the 720p frame

The second (R) will be cut into slices so that it fits into the free space left in the container. As shown in Figure 5.

Figure 5. Shaping the R frame

The three slices R1, R2 and R3 can then be inserted into the container as illustrated in the following figure (Figure 6).

Figure 6. Final frame structure

Since the two 720p video components have a frame rate of 50 fps, the overall frame rate for composite video frames will be 50 fps. In some specific situations, however, lower frame rates may also be acceptable (24 or 25 fps).

3DZ Tile format

Sisvel Technology is the company that developed the 3D Tile format, an innovative three-dimensional content transmission system compatible with normal HD 2D broadcasts. Sisvel Technology has joined forces with Triaxes, a Russian company specialized in software and hardware solutions for autostereoscopic displays, to create 3DZ Tile Format, a system that improves the performance of autostereoscopic 3D displays. This is the latest enhancement to the High Performance Tile Format, which gives users a better definition than existing alternatives; is also compatible with 2D High Definition TVs and offers significant benefits to broadcasters through the use of efficient broadband streams.

Current 3D devices require the generation of a large number of intermediate images or "views" sent to a special TV panel. To generate intermediate views, the TV needs a depth map, that is, a numerical representation of the depth of the scene.

The Tile format exploits the empty space at the bottom right of the composite video frame to display a depth map as a grayscale image. The Full HD 1080p frame from the 3DZ Tile Format provides the information you need to display 3D content in an optimized way for both stereoscopic (glasses) and autostereoscopic (without glasses) TVs.

Sisvel technology will feature rectangular cutting technology. This enables broadcasters to transmit 3D programs that can be viewed stereoscopically on 3D TVs simultaneously in 2D format on full HD TVs without the need for simulcasting.

Top of Form

Bottom of Form

Planificarea activității

Stadiul actual

Producerea și evoluția transmisiilor digitale prin satelit a deschis premizele dezvoltării transmisiilor digitale în domeniul radioului (DAB – Digital Audio Broadcasting) și al televiziunii (DVB – Digital Video Broadcasting).

Televiziunea digitală este în plină evoluție, cunoscând direcții multiple din punct de vedere al tehnologiilor de transmisie digitală:

televiziunea digitală terestră DVB-T (Digital Video Broadcasting – Terrestrial);

televiziunea digitală prin cablu DVB-C (Digital Video Broadcasting – Cable);

televiziunea digitală prin satelit DVB-S (Digital Video Broadcasting – Satellite);

televiziunea digitală (terestră) mobilă DVB-H (Digital Video Broadcasting – Handheld) – transmisie TV terestră pentru utilizatori mobili;

televiziunea digitală prin internet IPTV (Internet Protocol Television);

televiziunea digitală 3D. [6]

Succesul în privința conceptului de televiziunine 3D, care este transmis sau făcut public prin intermediul radioului sau a televizorului, care depind într-o largă măsură de anumite configurații care sunt în privintă aspectelor tehnice și aspectelor economice dar constă și în experiență utilizatorilor. Cu toate aceste aspecte, este destul de clar prin faptul că una dintre soluțiile oferite pentru succesul de implementare a conceptului 3D în televiziune este oferta unei funcții care să permită o tranziție fără probleme la 3D prin exploatarea sau valorificarea infrastructurii existente și care să asigure o compatibilitatea 2D ale versiunile sau variantelor anterioare, acestea fiind receptoarele mai vechi, în timp care doar presupune o creștere convenabilă a lătimii de bandă de transmisie.

Implementarea televiziunii 3D are la bază și cresterea rezoluției în procesul de captare și de redare a imaginilor. Este de știut că televiziunea de înaltă definiție cunoaște astăzi variantele de ultra înalta definiție Ultra-high-definition television (UHDTV) și chiar de super înalta definiție (SHDTV). Spre exemplificare, televiziunea Ultra-high-definition television (UHDTV) cunoscută și ca TV-4K, prezină o rezoluție de 3840×2160 pixeli pe cadru. Receptoarele TV cu prelucrare digitală sunt astăzi Smart TV, îngloband funcții caracteristice telefoanelor și devenind puternice centre multimedia în spațiul utilizatorului. [3]

În privință acestui obiectiv, Digital Video Broadcasting tocmai a eleborat o prima etapă de specificații a televiziuni 3D și a selectat un număr de cadre alcătuite dintru-un format compatibil pentru a multiplexa 3D într-o secvența video standard.

DVB (Digital Video Broadcasting) este un grupare industrială al celor mai mari companii de televiziune digitală și de tehnologie din lume, cum ar fi producătorii, dezvoltatorii de software, operatorii de rețea și autorități de reglementare, care s-au angajat să elaboreze standarde tehnice deschise pentru furnizarea de televiziune digitală și alte servicii de difuzare.

În ultima perioadă sau cel puțin în ultimul an, televizoarele implementate cu tehnologia 3D au avut un impact considerabil sau esențial pe piața de consum. Dacă, pe de o parte, tehnologia de afișare a imaginii se arată să fie gata să primească sau să adopte o nouă eră și anume cea a televiziuni 3D, pe de altă parte în continuare, sunt încă necesare anumite măsuri adiționale sau cel puțin suplimentare pentru a putea trasnforma sistemele de televiziune 3D într-o tehnologie pe scară largă, care să fie disponibilă pe piața cosumatorilor.

În acest concept, o solutie sau un rol cheie este interpretat de tehnologiile pentru televiziunea 3D care sunt reprezentate prin compresie și tehnolgii de distribuție.

În regiunea sau domeniul pentru divertismentul de acasa, asocitația Blu-ray Disk

a adoptat recent Multi View Coding (MVC) și anume vizualizarea codurilor multiple care reprezinta o exetensie de la AVC/H.264, adică o codare video avansată a standardului de codificare pentru a stoca 3D. [11]

H.264 sau AVC (de la Codare Video Avansată), reprezintă un standard de codec video care se deosebește printr-o rată de compresie ridicată. De asemenea, un encoder H.264 poate, fără să pieardă calitatea imaginii, adică să micșoreze formatul unui fișier video digital cu mai mult de 80% făcând o comparație cu formatul Motion JPEG ( de la Motion Joint Photographic Experts Group) și de asemena cu 50% mai mult că și standardul MPEG-4(de la Moving Picture Experts Group).

MPEG-4 care este definit de către Moving Picture Experts Group si reprezintă o normă de comprimare a datelor audio/video care a fost initial dezvoltat pentru codarea în televiziunea digitală interactivă care asigura o compresie mai mare si ulterior a fost extins pentru a include noi norme pentru audio/video care foloseste o codarare bazată pe obiecte(2D,3D). [13]

În domeniul multimedia, Motion JPEG (M-JPEG sau MJPEG) este un format de comprimare video în care fiecare cadru video sau un câmp intercalat al unei secvențe video digitale este comprimat separat ca imagine JPEG. Initial a fost dezvoltat pentru aplicații PC multimedia, M-JPEG este acum utilizat de dispozitivele de captare video, cum ar fi camere digitale, camere IP și camere web.

H.264/MPEG-4 (Motion Picture Expert Group)/ AVC (Advanced Video Coding), reprezintă un standard de compresie video de generație mai nouă, unul dintre cele mai folosite formate pentru înregistrare, compresie și distribuție de video de înaltă definiție.

Standardul de compresie video H.264/MPEG-4 (Motion Picture Expert Group)/ AVC (Advanced Video Coding) este folosit pentru:

stocare pe Blue-Ray Disc și HD-DVD

streaming pe Internet: YouTube, Vimeo, iTunes

playere software ca Adobe Flash Player, Microsoft Silverlight, Quicktime, Nero

transmisiune TV digitală: DVB-S2, DVB-C2, DVB-T2

înregistrare video HD la camere foto/video: AVCHD (Sony, Panasonic)

real-time videoconferencing [12]

Acest fapt sau lucru semnifică faptul că bandă de transmisie devine mai spațioansa, iar zona de stocare sau depozistare se va restrânge în mod semnificativ. Pe de o parte se așteaptă că în următoarea perioadă de timp, H.264 să devină principalul standard de compresie video.

În domeniul transmisiilor video situația este mai complexă datorită limitării lățimi de bandă, prin prezența dispozitivelor moștenite și compatibilitatea cu versiunile anterioare.

Pentru prima fază, una dintre problemele principale, este de a garanta o tranziție lină de la televizoarele 2D la cele 3D, în timp ce refolosesc cea mai mare parte a infrastructurii care este deja instalată și a echipamentelor folosite de utilizator. [1]

În explicarea acestui fapt, așa numitele formate compatibile cu cadrele au apărut ca soluții interesante, iar cele mai cunoscute fiind abordările de sus în jos (top-bottom, TaB) și unul lângă celălalt (side by side, SbS), unde cele două vederi ale unui videoclip stereoscopic sunt aranajte într-un singur cadru, dar cu dezavantajul de a reduce rezoluția spațială. [1]

Toate formatele compatibile cu cadrul pentru televizoare HD și pentru aplicații necesită o scădere semnificativă a rezoluției inițiale a imaginii de 1080p. Abordarea top-and-bottom (Tab) împarte în jumătate numărul de rânduri care se potrivesc celor două imagini stereo într-o singură imagine de 1080p. Același lucru se intamplă și pe coloane utilizând un aranjament side by side (SbS). [1]

Necesitatea de a putea transporta semnalele 3D care utilizează infrastructurile HD de producție cât și de distribuție existente au condus la dezvoltarea „Sistemelor de formare a imagini duble 3D stereoscopic”. Aceste tipuri de sisteme vor livra două imagini (una pentru ochiul stâng și alta pentru ochiul drept) care sunt aranjate în așa fel încât pot să fie vizualizate simultan (sau aproape simultan) de ochiul stâng și de ochiul drept.

Această aranjare imită binoclul natural pentru o experiență de vizionare iar cei care vizionează vor percepe o adâncime crescută în imagine.

Metoda de comprimare a elementelor care sunt compatibile cu cadrul 3D reprezinta una din diversele metode care au fost adoptate pentru efectuarea și realizarea celor două imagini ale unei perechi stereoscopice pe infrastructura High Definition TV (HDTV) existentă.

Metoda aceasta va produce un efect 3D prin combinarea imaginilor din stânga și din dreapta (pereche stereoscopică) care cuprinde informații 3D într-un singur cadru HD.

Sisteme stereoscopice similare cu dublă imagine au fost luate în considerare de industria cinematografică. Pe parcursul anilor , în perioadă așa numită și „era de aur” a cinematografiei 3D din ani 1950 , iar a doua perioadă în ani 1983 a filmelor 3D conduse de Hollywood, filmările stereoscopice au fost realizate printr-o varietate de metode.

Pentru fixarea unui adaptor de lentile 3D la obiectivul camerei de filmare (35 mm sau 16 mm) a permis camerei să direcționeze lumina din două puncte separate (ochiul stâng și dreapta), prin oglinzi și pe două părți separate ale aceluiași cadru de film.

Doua formate au fost folosite de cinematografie la momente diferite de timp:

„Side-by-Side”, care stochează imaginile pentru ochiul stâng și drept, unul lângă

celălalt într-un cadru divizat vertical, compresie pe orizontală.

Figura 7. Side-by-Side [3]

„Over-Under”, care stochează imaginile din stânga și din dreapta, una deasupra celeilalte într-un cadru împărțit orizontal, compresie pe verticală.

Figura 8. Over-Under [3]

În ziua de azi au fost adoptate noi tehnici care sunt similare cu cele ale unui cadru TV compatibil cu formatul 3D:

„Side-by – Side” (SBS) = imaginile din stânga și dreapta sunt introduse una lângă cealaltă în cadrul 720p sau 1080i HD. Acest lucru necesită o compresie pe orizontală a semnalului video care este înjumătățit pe orizontală.

Figura 9. Side-by-Side [8]

„Top-and-Bottom” (TAB) = imaginile din stânga și dreapta sunt introduse una deasupra celeilalte, în720p sau într-un 1080i HD. Aici, este necesară o compresie pe verticală a semnalului video care este înjumătățit pe verticală.

Figura 10. Top-and-Bottom [8]

„3D-Tile Format” = Două imagini de 720p (stânga și dreaptă) sunt aranjate într-un singur cadru de 1080p, prin introducerea unei imagini 720p neschimbată, care nu necesită nici o diminuare, în timp ce se divizează cealaltă imagine de 720p în trei părti și remaparea locației pixelilor fără filtrare / decimare.

Figura 11. 3D-Tile Format [8]

1.Fundamentare teoretică

1.1 Tile Format: un nou cadru pentru abordarea transmisiei video 3D

1.1.1 Descriere Tile Format

O altă explicație viabilă compatibilă cu cadrele este numită Tile Format (TF), care până în prezent a primit mai puțină atenție din partea comunității științifice. Cu toate acestea, Tile Format are câteva avantaje potențiale în ceea ce privește calitatea imaginii și compatibilitatea, dar care merită să fie investigate în continuare.

Tile Format este o soluție compatibilă cu cadre care permite ca două imagini de 1280 × 720 (vizualizarea din stânga și din dreapta a unui video stereoscopic) care urmează să fie aranjate într-o fotografie de 1920 × 1080 prin intermediul unui format Tile adecvat.

Specificația Tile Format este reprezentată grafic în figura 12: Vederea din stânga, care ocupă colțul din stânga sus al imaginii 1080, în timp ce vederea din dreaptă este împărțită în trei regiuni care sunt aranjate în conformitate cu strategia prezentată în figură.

La nivelul emițătorului, videoclipul stereoscopic de 720p este ascuns într-un format 2D de 1080p, la partea receptorului, Tile Format poate fi descăzut la un videoclip 2D de 720p prin definirea pur și simplu a unui dreptunghi pentru decupare care selectează doar vizualizarea din stânga.[5]

Figura 12. Specificații Tile Format [5]

Tile Format (TF) nu modifică raportul de aspect al imaginii, dar care necesită o sub-eșantionare de 1,5 în ambele direcții (de la 1080p la 720p). Performanțele în ceea ce privesc termeni de calitate a imaginii utilizatorului final depinde în mod clar de doi factori, și anume de calitatea imaginii High Definition TV (HD TV) interpolate, care este recuperată de la formatele compatibile cu cadrul și efectul de compresie video.

În special, sunt analizate atât efectele de interpolare cat și cele de codare AVC/H.264

(Codare Video Avansată) sau H.264 de compresie video 3D Tile Format (TF). În al doilea rând, vom descrie modul în care Tile Format (TF) este utilizat pentru a difuza video 3D pe o infrastructură DVB (Digital Video Broadcasting) existentă. Calitatea imaginii generate de Tile Format (TF) este analizată folosind obiectivul metric PSNR (Peak signal-to-noise ratio).

Raportul semnal-zgomot, care frecvent este abreviat PSNR (Peak signal-to-noise ratio), este un termen de inginerie care reprezintă raportul dintre puterea maximă posibilă a unui semnal și puterea de corupere a zgomotului care afectează fidelitatea reprezentării sale. Fiindca multe semnale au o gamă dinamică foarte largă, PSNR (Peak signal-to-noise ratio) este de obicei exprimată în funcție de scala logaritmică a decibelului.[14]

PSNR (Peak signal-to-noise ratio) este cel mai adesea utilizat pentru măsurarea calității necesară reconstrucției codecurilor de compresie cu pierderi (de exemplu, pentru compresia imaginilor). Semnalul în acest caz este cel original de date, iar zgomotul este eroarea introdusă prin compresie. Atunci când se compară codecurile de compresie, PSNR (Peak signal-to-noise ratio) este o aproximare a percepției umane asupra calității reconstrucției. Deși un PSNR (Peak signal-to-noise ratio) mai înalt indică în general că reconstrucția este de o calitate superioară, dar în unele cazuri nu poate.[14]

Pentru imaginile color cu trei valori RGB pe pixel, definiția PSNR (Peak signal-to-noise ratio) este același. Valorile tipice pentru PSNR (Peak signal-to-noise ratio) în imaginea pierdută și compresia video sunt între 30 și 50 dB, cu condiția ca adâncimea de biți să fie de 8 biți, unde este mai mare. Pentru date pe 16 biți valorile tipice pentru PSNR (Peak signal-to-noise ratio) sunt între 60 și 80 dB. [14]

În imaginile urmatoare sunt reprezentate diferite valori ale PSNR (Peak signal-to-noise ratio) :

(a)

(b)

(c)

(d)

Figura 13. (a) Imagine originală necomprimată (b) PSNR 45.53dB

(c) PSNR 36.81dB (d) PSNR 31.45dB [14]

1.2 Calitatea imaginii Tile Format

1.2.1 Efectul de interpolare

În cele ce urmează , montajele compatibile ale cadrului Tile Format (TF) și ale cadrul Top-and-Bottom (TAB) sunt comparate în ceea ce privește sau se analizează calitatea imaginii, doar atunci când acestea sunt interpolate înapoi la o rezoluție full HD. Setările care reprezintă experimentele sunt următoarele: imaginea de 1080p este sub-eșantionată la formatul dorit prin aplicarea unui filtru anti-aliasing, în care sub-eșantionarea reprezintă o tehnică în care se eșantionează un semnal cu bandă de trecere filtrată la o rată de eșantionare sub rată Nyquist obijnuita (adică jumătate din lărgimea de bandă a benzii de bază) iar filtrul anti-aliasing este un filtru folosit înaintea eșantionatorului de semnal, pentru a restrânge lărgimea de bandă a unui semnal . [15]

Imaginile originale și interpolate sunt comparate folosind Peak signal-to-noise ratio (PSNR). Fără nici o indoială, rezultatele pot depinde în mare măsură de tipul de conținut video.

De fapt, Top-and-Bottom (TAB) produce o reprezentare a modelelor orizontale, care este mai puțin precisă decât Tile Format (TF) datorită aliasing-ului mai mare pe frecvențele verticale. Pozițiile sunt inversate atunci când sunt luate în considerate frecvențe orizontale.[5]

Din figura 14 se poate observă că Tile Format (TF) se dovedește a fi un compromis foarte bun.

Figura 14. Tile Format(TF) și Top-and-Bottom (TB) compatibile cu formatele de calitate interpolare [5]

Rezultatele obținute în format „Side-by – Side” (SBS) nu au fost prezentate , dar în mod clar performanța este destul de asemănătoare cu „Top-and-Bottom” (TAB), cu excepția faptului că, în acest caz, frecvențele orizontale sunt penalizate, prin urmare, rezultatele sunt mai slabe pe secvențele care conțin o mulțime de detalii orizontale.[5]

1.2.2 Efectul de compresie

În această parte se analizează experimental atitudinea compresiei a conceptului Tile Format (TF). Într-adevăr, Tile creează margini artificiale, care ar putea avea un impact asupra eficienței de compresie. Experimentele au fost realizate pe două secvențe video stereo la 25 Hz, și anume Maga (film de animație de 12 s lungime) și The Eye (documentar lung de 100 de secunde). Imaginile din dreapta și din stânga sunt compuse într-o secvență video standard de 1080p cu Tile Format (TF). Apoi, videoclipul cu Tile Format (TF) de 1080p este codat și decodificat utilizând standardul AVC / H.264 (Codare Video Avansată).

Este de reamintit faptul că, în timp ce vizualizarea din stânga este pur și simplu decupată din colțul din stânga sus a video-ului Tile Format(TF), vizualizarea corectă se presupune prin decuparea și recompunerea de 3 piese așadar și, prin urmare, este mai critică din punct de vedere al rezultatelor. Videoclipurile obținute sunt comparate față de secvența inițială folosind Peak signal-to-noise ratio (PSNR).

Peak signal-to-noise ratio (PSNR) a fost evaluat pe întreg ansamblul de imagini și, de asemenea, la nivel local pe dungile verticale și orizontale, corespunzătoare la liniile de Tile din dreaptă așa cum se arată în figura 15. [5]

Figura 15. Definițiile locale ale Peak signal-to-noise ratio (PSNR) [5]

Calculul este păstrat local pe o bandă largă de pixeli W și care permite să captureze prezența de imagini false din cauza recompuneri cadrului din dreapta. În cele din urmă se va folosi notația P SNRV (W) și P SNRH (W) pentru a putea identifica evaluarea locală la Peak signal-to-noise ratio (PSNR) pe banda verticală respectiv și pe orizontală.

Calitatea imaginilor oferite de (Tile Format) TF a fost comparată cu cea din simulcast, adică, atunci când secvențele de 720p din stânga și dreapta sunt codificate separate.
Simulcast, reprezinta difuzarea simultană sau difuzarea programelor sau a evenimentelor pe mai mult de un mediu sau mai mult de un serviciu pe același mediu, exact în același timp.

Difuzare simultan, termen care se referă în mod tradițional la difuzarea simultană a aceluiași program pe două sau mai multe medii. De exemplu, un spectacol de radio difuzat pe radio FM și prin satelit, în același timp ar fi spus că este „simulcast”.

În figura 16 – (a) (b), Luma Peak signal-to-noise ratio (PSNR) este raportată ca o funcție a ratei de codare pentru vizualizările stânga (a) și dreapta (b) ale secvenței The Eye. [5]

(b)

Figura 16. Peak signal-to-noise ratio (PSNR) versus bitrate la secventa The Eye: Vedere stânga (a), Vedere din dreapta (b) [5]

În filme, luma reprezintă luminozitatea unei imagini (secțiunea „alb-negru” sau acromatica unei imaginii). Luma este de obicei asociată cu crominanța.

Luma reprezintă imaginea acromatică, în timp ce componentele de croma reprezintă informațiile de culoare. Conversia surselor RGB (cum ar fi ieșirea unei camere cu trei camere CCD) în luma și croma permite subasamblarea cromului: deoarece viziunea umană are o mai bună sensibilitate spațială la diferențele de luminanță („alb-negru”) decât diferențele cromatice, sistemele video pot stoca și transmite informații cromatice la rezoluție mai mică, optimizând detaliile percepute la o anumită lățime de bandă. [9]

Rezultatele obținute arată în mod clar că Tile Format (TF) nu suportă nici o penalizare de codare în ceea ce privește simulcast într-o gamă largă de viteză de codare de la câteva sute kbps până la 24 Mbps.

(c) (d)

Figura 17. (c) (d) reprezintă valorile PSNRH (W) și PSNRV (W) cu W = 6 pentru vizualizarea corectă a secvenței The Eye [5]

Și în acest caz, valorile obținute cu Tile Format (TF) sunt comparate cu simulcast. Datorită utilizări Tile Format (TF) se produce o deteriorare semnificativă de aproximativ 3 db în ceea ce privește simulcastul numai atunci când bitrate-ul este sub 1 Mbps.

1.3 Transmisiunea cu Tile Format (TF)

După cum sa menționat deja, avantajul major al Tile Format (TF) reprezintă compatibilitatea cu un lanț de televiziune High Definition TV (HD TV) care este deja implementat. Scopul acestui studiu este de a demonstra fezabilitatea amestecării conținutului 2D și 3D într-un singur canal. Utilizarea Tile Format (TF) permite distribuirea pe o infrastructură HD deja existentă; compatibilitatea (2D) a formatului permite direcționarea fără probleme a utilizatorilor 2D și 3D cu un singur conținut.

Acest lucru este deosebit de relevant, deoarece canalele de emisie sunt o resursă limitată, iar costul ridicat face ca simulcasting-ul versiunii 2D și versiunea stereoscopică a aceluiași conținut sa fie imposibil de realizat pentru majoritatea operatorilor.

Sistemul de proces este ilustrat în figura 18: Videoclipul stereoscopic din ambele surse sau dispozitive de stocare live este absorbit ca și un singur flux video folosind Tile Format(TF). [5]

Figura 18. Schema procesului de difuzare 3D [5]

După care se aplică codificarea H.264. Codificatorul H.264 adoptat oferă o implementare prototip a mecanismelor de semnalizare care au fost definite de DVB (Digital Video Broadcasting), permițând amestecarea perfectă a elementelor pentru programelor 2D și 3D. În special, mesajele H.264 sunt utilizate pentru a semnala aranjamentul de împachetare al cadrului video.

Mai mult decât atât, un dreptunghi pentru decupare este inclus în setul de parametri H.264 pentru a furniza o prezentare compatibilă 2D din Tile Format (TF). Aplicând receptoarele 2D vechi pentru dreptunghi-urile de decupare pur și simplu vom obține un video 720p corespunzător vizualizării din stânga stocate în colțul din stânga sus al Tile Format (TF).
În cele din urmă, semnalul video comprimat este multiplexat în fluxul de transport DVB (Digital Video Broadcasting) și este utilizat pentru difuzarea pe infrastructura terestră existent.

La celalat capăt adică cel de receptor, este prevăzut cu două scenari. Un televizor 2D HD sau decodorul primește semnalul RF, demultiplexează TS, decodează fluxul video, apoi aplică dreptunghiul de decupare și raportul de eșantionare a probelor, așa cum este specificat în fluxul de biți, și mărește imaginea de 720p la rezoluția dorită a afișajului oferind o vizualizare 2D.

Folosind același semnal RF, un set top box corespunzător conectat la un televizor 3D decodifică videoclipul, detectează mesajele SEI care descriu aranjamentul compatibil cu cadru, după care sare peste dreptunghiul de tăiere și afișează imaginea stereoscopică.

Studiile în curs nu demonstrează numai fezabilitatea tehnică a difuzării de programe 3D, ci și posibilitatea de a începe o tranziție fără probleme între 2D și 3D fără a avea un impact asupra infrastructurii de difuzare și asupra dispozitivelor utilizatorilor finali. [5]

1.4 Evaluarea rezoluției

În cinematografie și televiziune, termenul de „rezoluție” este înțeles pentru a putea evalua cât de apropiate sunt detaliile de imagine (în mod ideal considerate ca linii alternative strălucitoare și întunecate) și pot fi rezolvate în mod vizibil.

În cinematografie, evaluarea rezoluției este legată de dimensiunile fizice, specificate ca fiind „numărul de linii pe unitate de distanță” (L / mm, linii pe mm) de-a lungul axei verticale și orizontale.

În televiziune, evaluarea rezoluției este legată de dimensiunea generală a imaginii, specificată orizontal și vertical prin „numărul de linii pe înălțime imagine” (LPH).

În special:

Rezoluția pe verticală (NV) definește capacitatea sistemului de a rezolva liniile orizontale și depinde în primul rând de numărul de linii de scanare per imagine și de efectele combinate ale camerei și ale capacităților de afișare. Este specificat ca numărul de linii orizontale distincte care pot fi rezolvate în mod satisfăcător pe ecranul televizorului.

Rezoluția pe orizontală (NH) definește capacitatea sistemului de a rezolva liniile verticale. Aceasta depinde de frecvența de eșantionare adoptată de sistem, luând în considerare raportul de aspirație (AR) al sistemului și frecvența de întrerupere a filtrului anti-aliasing.
Este prescris ca numărul de linii verticale distincte, care pot fi rezolvate în mod satisfăcător în 1 / AR (de la raportul de aspirație) de lățimea unui ecran de televiziune.

Figura 19. Rezoluția pe vertical(NV) / Rezoluția pe orizontală (NH) [3]

1.4.1 Rezoluția pe verticală

Rezoluția pe verticală ar fi egală, în mod ideal, cu „numărul de linii active” (Nal) pe cadru. Acest lucru se va întâmpla numai dacă liniile de scanare ale oricărei mijloace de achiziție (camera sau scanerul, unde linia de scanare este efectuată la un rând de celule sensibile) au fost centrate pe detaliile imaginii. Dimpotrivă, se va produce o pierdere completă a rezoluției verticale atunci când locul de scanare se află în fața detaliilor fotografiei.

O pierdere în rezoluția verticală poate fi semnificată prin înmulțirea numărului de linii active (Nal) cu factorul vertical Kell (vKf), a cărui valoare, care poate fi detectată statistic cu scanare progresivă, a fost între 0,6 și 0,8 pentru vechiul sensor catodic si display-uri și între 0,85 și 0,953 si pentru scanerele moderne cu pixel fix (CCD, CMOS) și display (LCD PDP).

Prin urmare valoarea rezoluției verticale este:

NV = Nal x vKf [linii]

O altă pierdere a rezoluției verticale ar putea apărea numai pe detaliile care se mișcă în imagine pentru sistemele de scanare intercalate. O astfel de pierdere este semnalată de factorul Interlace (If), descris ca „raportul dintre liniile de rezoluție percepute într-o imagine video produsă utilizând scanarea intercalată, împărțită la liniile de rezoluție percepute în aceeași imagine video, cu excepția celor produse folosind scanare progresivă”.

Se evaluează statistic ca 0,7, prin care liniile active trebuie multiplicate pentru a obține rezoluția verticală intercalată Nvi :

NVi = Nal x vKf x If [linii]
Notă: pentru imaginile progresive, valoarea factorului de intercalare este 1,0.[3]

1.4.2 Rezoluția pe orizontală

Rezoluția pe orizontală ar fi egală, în mod ideal, cu „numărul de eșantioane pe linii active” (Nsa) împărțit la raportul de aspect (AR). Acest lucru s-ar întâmpla numai dacă celulele senzorilor mijloacelor de achiziție (camera, scaner) au fost centrate orizontal pe detaliile imaginii.

Dimpotrivă, se va produce o pierdere completă a rezoluției orizontale atunci când celula senzorului se va împrăștia în detaliile fotografiei. Această pierdere este reprezentată de factorul orizontal Kell (hKf), a cărui valoare este între 0,85 și 0,95.

Prin urmare valoarea rezoluției orizontale este:

NH = Nsa x hKf / AR [linii]

În următorul tabel se prezintă rezumatele valorilor rezoluției verticale NV2D și orizontale NH2D calculate pentru sistemele HD 2D disponibile în prezent. [3]

Tabel.1 Parametrii sistemelor HD 2D [3]

2. Implementarea soluției adoptate

2.1 Implementarea formatului Tile 3D

2.1.1 Descrierea formatului Tile 3D

Stereoscopia, numită „stereoscopics” sau imagini 3D este o tehnică pentru crearea sau consolidarea iluziei de adâncime într-o imagine prin intermediul stereoscopului (stereopsis) pentru o vedere binoculară. Procesul stereocopiei crează iluzia de spațiu (adâncime) tridimensional pe un plan bidimensional.

Percepția steroscopică dă posibilitatea observatorului să distingă mai multe detalii ale obiectelor și poate primi astfel mult mai multe informații despre obiectele din spațiu, cu precizarea că acestea sunt rezultatul analizei celor două imagini la nivelul creierului care se antrenează de la primele percepții vizuale.

Percepția steroscopică dă posibilitatea observatorului să distingă mai multe detalii ale obiectelor și poate primi astfel mult mai multe informații despre obiectele din spațiu, cu precizarea că acestea sunt rezultatul analizei celor două imagini la nivelul creierului care se antrenează de la primele percepții vizuale.

Ideea din spatele filmului 3D este transmiterea a două imagini separate (stânga și dreapta), pentru a reproduce viziunea stereoscopică umană, ambalată într-un singur flux.

Provocarea pentru furnizorii de servicii este ca transmisiile 3D să fie compatibile înapoi, astfel încât aceeași infrastructură să poată fi utilizată atât pentru conținut 2D și 3D.

Este posibil ca difuzarea numai în 3D să fie într-o anumită măsură, astfel încât, între timp, ca și în cazul mono AM și radio FM stereo, coexistența cu 2D va rămâne o necesitate practică.

Tehnologia Sisvel demonstrează că formatul 3D Tile este o soluție care îmbunătățește transmisia 3D printr-o tehnică care este realizată din imagini stereoscopice. Această nouă tehnologie permite livrarea conținutului HD 3D cu o calitate superioară celei actuale și permite radiodifuzorilor să transmită un serviciu video unic ,atat pentru publicul 2D, cat si pentru publicul 3D.

În cinematografie și televiziune ecranele 3D asigură afișarea și transmisia de imagini diferite pentru fiecare ochi în parte folosind strategii diferite de separare a vederii binoculare:

vizualizatorul poartă ochelari pentru a combina imagini realizate separat și care

provin din două surse;

vizualizatorul poartă ochelari de vedere pentru a filtra imaginile diferență, separat

pentru fiecare ochi, provenite dintr-o singură sursă;

se împart sursele de imagini direcțional în ochii privitorului.[6]

Astfel, telespectatorii cu echipamente 3D se pot bucura pe deplin de experiența de vizionare 3D, în timp ce consumatorii cu televizoare tradiționale 2D vor viziona serviciul în 2D.

Quartarete TV (Italia), care lucrează în tandem cu Sisvel Group, utilizeaza acest format pentru a oferi HD și conținut 3D (pentru ochiul drept și stâng) în cadrul unui singur semnal HD 1080p/50.

Formatul Tile 3D foloseste o serie de algoritmi care divizează a doua imagine 3D în trei părți, asezand-o in dreapta si sub imaginea pentru celalat ochi, iar rezultatul este comprimat în H.264 și apoi transmis, împreună cu prima imagine, intr-un singur cadru HD.

Figura 20. Structura formatului Tile 3D [4]

Asadar, una dintre imagini este codată nefragmentat în streamul H.264 a (si aceasta imagine poarta denumirea de „dreptunghi de trunchiere”). Aceasta este redată ca atare, adică

cu imaginea intreagă, daca semnalul este receptionat pe televizorul 2D. Deci de obicei un decodor obisnuit va afișa doar zona cadrului închisă de dreptunghiul de trunchiere.

Această abordare nu numai că cauzează o pierdere a calității video, diminuând în jumătate rezoluția verticală sau orizontală a imaginii sursă, dar face și transmisia 3D nepotrivită pentru a fi vizionată pe receptoarele TV 2D.

Sisvel Technology a creat formatul 3D Tile , o soluție care permite stocarea integrată a două cadre stereo 720p într-un singur cadru 1080p. Imaginile reconstituite din stânga și din dreapta își păstrează rezoluția inițială și nu vor fi afectate de dezechilibrul rezoluției verticale și orizontale.

Amplasarea imaginilor din cadrul formatului Tile, împreună cu tehnologiile compatibile standard dezvoltate de Sisvel Technology, permit fără întrerupere decodarea videoclipului 2D de la transmisia 3D.

Un decodor compatibil 3D Tile care primeste acelasi semnal 3D comprimat H.264, va stii sa preia fragmentele si sa le trimita catre televizor compatibil.

Datorită creativității formatului 3D Tile, acest sistem poate fi implementat chiar și în ultima generație de set-top box-uri HD și televizoare cu o actualizare software simplă.

2.1.2 Structura formatului Tile 3D

Formatul Tile 3D este un format compatibil cu cadru care permite stocarea a două cadre 720p într-un singur cadru 1080p.

În acest caz, dacă imaginile L și R au originea în format 720p, nu este necesară nicio decimare, iar imaginile reconstruite L și R își vor păstra rezoluția inițială și nu vor suferi dezechilibru în rezoluția verticală și orizontală.

În plus, deoarece una dintre cele două imagini rămâne neschimbată, formatul rezultat poate fi de asemenea compatibil cu serviciul.

Așa cum este ilustrat în figură 21, primul cadru 720p (L, în exemplu) este introdus nemodificat în cadrul de 1080p.

Figura 21. Încadrarea cadrului 720p [9]

Al doilea (R) va fi tăiat în felii, astfel încât să se potrivească în spațiul liber rămas în cadrul containerului. . Așa cum este prezentat în figura 22.

Figura 22. Împărțirea cadrlui R [9]

Cele trei felii R1, R2 și R3 pot fi apoi introduse în cadrul containerului așa cum este ilustrat în figura următoare (Figura. 23).

Figura 23. Structura finala a cadrului [9]

Deoarece cele două componente video 720p au o rată a cadrelor de 50 de fps, rata globală a cadrelor video obținute la compozit va fi de 50 fps. În unele situații specifice, cu toate acestea, rate de cadre mai mici ar putea fi, de asemenea acceptabil (24 sau 25 fps).

Figura următoare prezintă un exemplu de cadru compozit în conformitate cu formatul Tile 3D:

Figura 24. Afișarea unei imagini in formatul Tile 3D [9]

Top of Form

Bottom of Form

2.1.3 Descrierea formatului Tile 3DZ

Sisvel Technology este compania care a dezvoltat formatul de Tile 3D , un sistem inovativ pentru transmiterea conținutului în trei dimensiuni, compatibile cu transmisiunile HD 2D normale. Sisvel Technology și-a unit forțele cu Triaxes – o companie rusă specializată în soluții software și hardware pentru afișaje autostereoscopice , pentru a crea 3DZ Tile Format, un sistem care îmbunătățește performanța afișajelor 3D autostereoscopice. Aceasta este cea mai recentă îmbunătățire a formatului Tile de înaltă performanță, care oferă utilizatorilor o definiție mai bună decât alternativele existente; este, de asemenea, compatibil cu televizoarele de înaltă definiție 2D și oferă avantaje semnificative radiodifuzorilor prin utilizarea unui flux eficient de bandă largă.

Dispozitivele 3D actuale necesită generarea unui număr mare de imagini intermediare sau „vizionări” trimise către un panou TV special. Pentru a genera vizionările intermediare, televizorul are nevoie de o hartă de adâncime, și anume o reprezentare numerică a profunzimii scenei.

Formatul Tile exploatează spațiul gol din dreapta jos al cadrului video compozit pentru a difuza o hartă de adâncime reprezentată ca o imagine pe scară gri. Cadrul Full HD 1080p din formatul 3DZ Tile Format furnizează informațiile necesare pentru a afișa conținutul 3D într-un mod optimizat, atât pentru televizorul stereoscopic (cu ochelari) cât și pentru televizorul autostereoscopic (fără ochelari). [2]

Tehnologia Sisvel va prezenta tehnologia de decupare a dreptunghiului. Aceasta permite radiodifuzorilor să transmită programe 3D care pot fi vizualizate stereoscopic pe televizoare 3D și simultan în format 2D pe televizoare full HD fără a fi nevoie de simulcasting.

Imaginile următoare arată modul în care diferite tipuri de afișare utilizează informațiile conținute în formatul 3DZ Tile Format: [4]

Figura 25. Formatul 3D Tile transformându-se în formatul 3DZ Tile [4]

Pentru a susține vizualizarea pe afișaje autostereoscopice, o hartă de adâncime poate fi inserată în porțiunea goală a containerului de 1080p, după cum se arată în figura următoare. Rezoluția hărții de adâncime este de 640×360 pixeli. Acest aranjament video este așa numitul format 3Dz Tile: [2]

Figura 26. Afișarea unei imagini in formatul Tile 3DZ [4]

Display-urile comune 2D utilizează numai imaginea din stânga, în timp ce display-urile stereoscopice utilizează atât imaginea din stângă, cât și imaginea din dreapta (reconstruită din cele trei piese) și afișajele autostereoscopice utilizează imaginea din stângă și harta de adâncime.

Figura 27. Utilizarea formatelor Tile 3DZ [4]

2.2 Evaluarea rezoluției H & V imaginiilor TV 3D

Încărcarea informațiilor 3D care sunt compuse din două imagini într-un singur cadru se realizează prin comprimarea imaginilor de pe orizontală (reducerea numărului de eșantioane pe linia activă Nsa) iar vertical se realizează prin (reducerea numărului de linii active Nal) sau ambele.

Aceast comprimare poate reduce rezoluția corespunzătoare prin următorii factori:

Factor de reducere pe vertical Vrf = Nal redus/ Nal original

Factor de reducere pe orizontală Hrf=Nsa redus/Nsa original

Așadar rezoluțiile H și V ale imaginilor 3D din stânga și din dreapta sunt:

Rezoluție verticală 3D NV3D = NV2D x Vrf

Rezoluția orizontală 3D NH3D = NH2D x Hrf

După stabilirea unei linii de bază pentru rezoluția imaginii 2D, cele de mai sus calculează noile valori pentru rezoluția verticală NV și rezoluția orizontală NH în diferite condiții de comprimare care au fost adoptate de industria 3D ținând cont de valorile NV2D și NH2D din tabelul 1.

Valorile Nv și NH descrise mai jos oferă o viziune interesantă asupra performanței și utilizabilității diferitelor sisteme 3D.

2.2.1 3D Side-by-Side 720p/50

Figura 28. Structura 3D Syde-by-Side 720p/50 [3]

Imaginile din stânga și din dreapta, comprimate orizontal la un raport de aspect de 640×720, sunt aranjate una lângă alta într-un cadru de 1280×720 și transmise în format 720p / 50.

În aceste condiții: Vrf = 720/720 = 1.0 Hrf = 640/1280 = 0.5

Valorile rezoluției devin:

Rezoluție pe verticală: NV3D = NV2D x Vrf = ≈648 x 1.0 = ≈648 LPH

Rezoluție pe orizontală: NH3D = NH2D x Hrf = ≈648 x 0.5 = ≈324 LPH

2.2.2 3D Side-by-Side 1080i/25

Figura 29. Structura 3D Syde-by-Side 1080i/25 [3]

Imaginile din stânga și din dreapta, comprimate orizontal la un raport de aspect de 960×1080, sunt aranjate una lângă alta într-un cadru de 1920×1080 și transmise în format 1080i / 25.

În aceste condiții:Vrf = 1080/1080 = 1.0 Hrf = 960/1920 = 0.5

Valorile rezoluției devin:

Rezoluție pe verticală: NV3D = NV2D x Vrf = ≈680 x 1.0 = ≈680 LPH

Rezoluție pe orizontală: NH3D = NH2D x Hrf = ≈972 x 0.5 = ≈486 LPH

2.2.3 3D Side-by-Side 1080p/50

Figura 30. Structura 3D Syde-by-Side 1080p/50 [3]

Imaginile din stânga și din dreapta, comprimate orizontal la un raport de aspect de 960×1080, sunt aranajate una lângă alta într-un cadru de 1920×1080 și transmise în format 1080p / 50.

În aceste condiții:Vrf = 1080/1080 = 1.0 Hrf = 960/1920 = 0.5

Valorile rezoluției devin:

Rezoluție pe verticală: NV3D = NV2D x Vrf = ≈972 x 1.0 = ≈972 LPH

Rezoluție pe orizontală: NH3D = NH2D x Hrf = ≈972 x 0.5 = ≈486 LPH

2.2.4 3D Top-and-Bottom 720p/50

Figura 31. Structura 3D Top-and-Bottom 720p/50 [3]

Imaginile din stânga și din dreapta, comprimate vertical la un raport de aspect de 360×1280, sunt aranjate „de sus și de jos” într-un cadru de 1250×720 și transmise în format 720p / 50.

În aceste condiții:Vrf = 360/720 = 0.5 Hrf = 1280/1280 = 1.0

Valorile rezoluției devin:

Rezoluție pe verticală: NV3D = NV2D x Vrf = ≈648 x 0.5 = ≈324 LPH

Rezoluție pe orizontală: NH3D = NH2D x Hrf = ≈648 x 1.0 = ≈648 LPH

2.2.5 3D Top-and-Bottom 1080i/25

Figura 32. Structura 3D Top-and-Bottom 1080i/25 [3]

Imaginile din stânga și din dreapta, comprimate vertical la un raport de aspect de 1920×540, sunt aranjate „de sus și de jos” într-un cadru 1920×1080 și transmise în format 1080i / 25.

În aceste condiții:Vrf = 360/720 = 0.5 Hrf = 1280/1280 = 1.0

Valorile rezoluției devin:

Rezoluție pe verticală: NV3D = NV2D x Vrf = ≈680 x 0.5 = ≈340 LPH

Rezoluție pe orizontală: NH3D = NH2D x Hrf = ≈972 x 1.0 = ≈972 LPH

2.2.6 3D Top-and-Bottom 1080p/50

Figura 33. Structura 3D Top-and-Bottom 1080p/50 [3]

Imaginile din stânga și din dreapta, comprimare vertical la un raport de aspect de 1920×540, sunt aranjate „de sus și de jos” într-un cadru de 1920×1080 și sunt transmise în format 1080i / 25.

În aceste condiții:Vrf = 540/1080 = 0.5 Hrf = 1920/1920 = 1.0

Valorile rezoluției devin:

Rezoluție pe verticală: NV3D = NV2D x Vrf = ≈972 x 0.5 = ≈486 LPH

Rezoluție pe orizontală: NH3D = NH2D x Hrf = ≈972 x 1.0 = ≈972 LPH

2.2.7 3D Tile Format 1080p/50

Figura 34. Structura 3D Tile Format 1080p/50 [3]

Imaginile din stânga și din dreapta, atât în ​​format 720p / 50, sunt încărcate în interiorul unui cadru de 1920×1080 și sunt transmise în format 1080p / 50. Procesul de compresie este înlocuit de un proces de remapare mai sigur, care elimină problemele de degradare a imaginii.

Imaginea din stânga este inserată în partea din stânga sus a cadrului 1920×1080, în timp ce imaginea din dreapta este împărțită în trei feli inserate în spațiul rămas al cadrului 1920×1080.

În consecință, rezoluția este aceeași ca și în cazul formatului de 720p.

Rezoluție pe verticală: NV3D = ≈648 LPH

Rezoluție pe orizontală: NH3D = ≈648 LPH

Top of Form2.3 Standarde HDTV

HDTV semnifică televiziune High Definition TV sau televiziune cu rezoluție înaltă, care, se poate traduce pe scurt printr-un sistem digital de difuzare a imaginilor televizate care asigură o rezoluție a imaginilor îmbunătățită sau superioară față de televiziunea clasică folosită în sistemele tradiționale care sunt reprezentate prin sistemele analogice (SECAM „Sequential Color with Memory”, NTSC„National Television Standards Committee”, PAL„Phase Alternating Line”) fiind numite în general ca și „rezolutie standard”- Standard Definition TV (SDTV).

O dată cu trecerea timpulului numărul standardelor de televiziune reprezentate prin rezoluție inaltă s-a mărit considerabil. În general există două mari categorii de standarde pentru rezoluția înaltă:

High Definition – ready (HD-ready), cu 1280  x 720 pixeli în forma 720p (progressive) (= 720 linii progresive)

Full High Definition (Full HD), cu 1920 x 1080 pixeli, fie în forma 1080i (interlaced), fie în forma 1080p (progressive) (= 1080 linii, fie întrețesute, fie progresive). [19]

Figura 35. Diferența dintre HD ready și Full HD [19]

Televizioarele High Definition – ready (HD – ready) se incadrează în standardul 720p, de unde se sublineaza faptul că poate reda un conținut video care să aibe o rezoluție de 1280 x 720 pixeli. Dar în momentul actual, o mare parte dintre televizoare High Definition (HD) pot să lucreze cu o rezoluție de 1366 x 768 pixeli. Un High Definition-ready (HD-ready) se poate utiliza pentru vizionarea canelelor de televiziune sau pentru un filme într-un format 720p deoarece își face foarte bine treabă. [20]

Full High Definition (Full HD) măsoară o rezoluție de 1920 x 1080 pixeli, unde calitatea unui conținut video este de 5 ori mai mare față de calitatea imaginilor standard Standard Definition TV (SDTV), precum se observă din caracteristicile afișate în tabelul 2 și din imaginea urmatoare:

Figura 36. Diferența clară dintre HD – ready și Full HD [24]

Tabel.2 Specificații pentru dispozitivele HD – ready și Full HD [20]

Intrarea YPbPr este un spațiu de culoare care este utilizat în electronica video, în special în ceea ce privește cablurile componenteloer video. În realitate există de fapt multe tipuri de componente video, dintre care majoritatea sunt o formă de RGB. YPbPr este convertit din semnalul video RGB, care este împărțit în trei componente: Y, PB și PR. unde Y transporta informația de luma (luminozitate sau luminanță) și sincronizare, PB transporta diferența dintre albastru și luma (B – Y) iar PR transporta diferența dintre roșu și luma (R – Y).

Conectorii RCA de utilizați pentru a scoate un video component YPbPr dintr-un set-top-box, un DVD player sau un dispozitiv similar. Conexiunile de tip mama din această configurație sunt de asemenea utilizate pentru intrările YPbPr pe dispozitivele de afișare, cum ar fi televizoarele. [22]

Figura 37. Intrările YPbPr [22]

Pixel mapping 1:1 reprezintă o tehnică de afișare video aplicată dispozitivelor cu pixeli

fixi native, adică se reda imaginea pe ecran pixel pe pixel care mai exact va afișa o sursă de intrare fara scalare sau procesare (adică fară să folosească benzile negre care apar la marginea ecranului, verticale sau orizontale) astfel încât fiecare pixel primit este mapat la un singur pixel nativ.

High-Bandwidth Digital-Content Protection (HDCP) este o formă de protecție împotriva copierii digitale, dezvoltată de Intel Corporation, pentru a împiedica copierea conținutului audio și video digital în timp ce se deplasează prin conexiuni. Este un sistem care ofera protecție a conținutului video în timpul unei transmisi dintre transmițător (laptop, PC) si emițator (televizor, monitor). Pentru a oferi un dispozitiv care să funcționeze cu HDCP,

producătorul trebuie să obțină o licență și să plătească o taxă anuală și să se supună unor condiții diferite. [21]

În prezent unele dintre cele mai întâlnite rezoluții High Definition (HD) sunt 1280 x 720 pixeli (standardul 720p) și 1920 x 1080 pixeli (standardele 1080i și 1080p). [19]

2.3.1 Standardul 720p

Standardul 720p cuprinde (1280 x 720 pixeli, fiind denumit și HD Ready) care reprezintă un format progresiv de semnal High Definition TV (HDTV) cu 720 de linii orizontale și un raport de aspect (AR) de 16: 9, cunoscut în mod normal ca High Definition TV (HDTV). Rată cadrelor este dependentă de standarde, iar pentru transmisiile convenționale apare în 50 de cadre progresive pe secundă pentru semnalele PAL / SECAM Europa, Australia, altele) și 59,94 cadre pe secundă pentru semanalul NTSC (America de Nord, Japonia, Brazilia, altele). [17]

Numărul 720 reprezintă 720 de linii orizontale de scanare a rezoluției de afișare a imaginii (care este cunoscută și ca rezoluție pe verticală de 720 pixeli). „p-ul” de după 720 vine sau reprezintă scanarea progresivă, adică ne-intercalată, care se poate traduce prin faptul că întreagă imagine de pe ecran (adică toate cele 720 linii) sunt redesenate în fiecare secundă de un număr de ori egal cu frecvența. Termenul presupune un format de 16:9 al imagini. [19]

2.3.2 Standardul 1080i

Standardul 1080i reprezintă numele pe scurt pentru televiziunea cu rezoluție înaltă sau pentru modulul High Definition TV (HDTV) în care „i-ul” înseamnă „video intercalat” sau în engleza „interlaced video” dar totuși standardul 1080i difera de standardul 1080p deoarece „p-ul” înseamnă „scanare progresiva”.

O imagine în format widescreen este reprezentată de termenul 1080i care are un raport de aspect (AR) al imagini de 16: 9 care are ca rezultat un cadru de marimea 1920 x 1080, în care fiecare cadru este format din alte două cadre suprapuse dintr-un video, având 1920 x 540 pixeli.

Rata la 1080i este de obicei 60 de Hz pentru țările care folosesc sau au folosit sistemul M (NTSC și Brazilian PAL-M) ca sistem de televiziune analogică (cum ar fi Statele Unite, Mexic, Japonia, Coreea de Sud, Taiwan și Filipine) sau o rata de 50 Hz pentru regiuni care au utilizat sau utilizează de regulă imaginile video cu o rată 25 cadre/sec cum ar fi (regiunile Europa, Australia, și o mare parte din America de Sud și Africa) dar amândouă variantele pot fi utilizate pentru transmisie la standardele de televiziune digital. [16]

2.3.3 Standardul 1080p

Standardul 1080p 1 (1920 × 1080 pixeli), de asemenea cunoscut sub numele de Full Hign Definition (Full HD) este alcătuit dintr-un set de moduri video Hign Definition TV (HDTV) de înaltă definiție caracterizate prin 1080 linii orizontale de rezoluție verticală, unde „p-ul” reprezintă scanarea progresivă. Termenul de 1080p presupune, de obicei, un raport de aspect de 16: 9. Este adesea comercializat ca Full Hign Definition (Full HD), pentru a contrasta 1080p cu ecrane de rezoluție de 720p.

Aplicațiile în care este inclus standardului 1080p includ emisiuni de televiziune, discuri Blu-ray, telefoane inteligente, conținut pe internet, cum ar fi videoclipuri YouTube și emisiuni TV și filme Netflix, televizoare și proiectoare de calitate pentru consumatori, monitoare de calculator și console de jocuri video. Videocamerele mici, smartphone-urile și camerele digitale pot capta imagini în mișcare și în rezoluția de 1080p

Orice dispozitiv de afișare care promovează standardul 1080p se referă de obicei la capacitatea de a accepta semnale de 1080p în format de rezoluție nativă, ceea ce înseamnă că există o lățime adevărată de 1920 pixeli și o înălțime de 1080 de pixeli.

În urmatorul tabel sunt prezentați parametri și valorile rezoluțiilor pe verticală și orizontală pentru sistemele în format 2D și în format 3D pentru standardele 720p, 1080i, 1080p. [18]

Tabel.3 Rezoluție pe verticală și orizontală în sisteme 2D și 3D [3]

2.4 O metodă de a transforma un cadru compatibil 3D AVC (Codare Video Avansată) / H.264 într-o imagine compatibilă cu serviciul 2D

Pe baza specificațiilor standard, un codificator AVC (Codare Video Avansată) / H.264 este capabil să comprime imagini rectangulare având dimensiuni orizontale sau verticale care sunt multiplii întregi ai dimensiunii macroblocului (16 pixeli).

Acest lucru clarifică faptul că formatele cum ar fi 1920 x 1080 trebuie să fie adaptate, astfel încât să facă față limitei menționate. În cazul specific formatului 1080, encoderul adaugă 8 linii goale la video, astfel încât formatul de ieșire va fi de 1920×1088.

Parametrul dreptunghiului de decupare a fost introdus ca un mijloc de a permite unui decodor să recupereze formatul original de imagine, trăgând liniile suplimentare goale în partea de jos. Deoarece nu există limite teoretice la valorile la care acest parametru ar putea fi setat la (orice valori din limitele cadrului imaginii sunt considerate valide), dreptunghiul de decupare poate fi folosit ca un "instrument" pentru a scoate orice regiune dreptunghiulară a cadrului de intrare .

În special, dacă cadrul de intrare este un cadru compozit utilizat pentru transmisii video stereoscopice 3D (așa numitele moduri compatibile Frame-Top sau Bottom), dreptunghiul de decupare poate fi utilizat pentru a delimita o zonă din cadrul care conține numai una din cele două vizualizări 2D, după cum se ilustrează în imaginile de mai jos, un decodor compatibil AVC (Codare Video Avansată) / H.264, după decomprimarea unui astfel de videoclip, acesta va afișa numai vizualizarea conținut în cadrul dreptunghiului de decupare. [2]

Ieșire decodificată Ieșire decupată Ieșire scalată

(cu dreptunghiul de decupare

în roșu)

Figura 38. Video-ul de ieșire este calibrat corect și oferă un format compatibil 2D [2]

Testele preliminare au demonstrat că majoritatea televizoarelor și set-top-boxelor existente, deja echipate cu un decodor AVC / H.264 integrat, sunt concepute pentru a trăi și a prezenta video în mod corect.

Raportul de aspect al videoclipului de pe ecran poate fi controlat automat cu ajutorul raportului de aspect al eșantionului (Sample Aspect Ratio – SAR), parametrul care descrie „raportul dintre distanța orizontală între coloane și distanța verticală între rândurile luma Set de mostre într-un cadru”.

Prin specificarea unui SAR(raportul de aspect) de 2:1, dimensiunea orizontală a videoclipului tăiat va fi dublată în lățime la momentul afișării; În timp ce cu un SAR (raportul de aspect) de 1:2 dimensiunea verticală a videoclipului tăiat va fi dublată la momentul afișării. [2]

2.5 Conversia formatului Tile 3D în format de împachetare a cadrelor HDMI

HDMI (High-Definition Multimedia Interface), interfață multimedia de înaltă definiție, este o interfață audio / video pentru transmiterea de date video necomprimate și date audio digitale comprimate sau necomprimate de la un dispozitiv cu sursă compatibilă HDMI, cum ar fi un controler cu afișaj, un monitor de computer, video proiector, televizor digital sau dispozitiv audio digital. HDMI (High-Definition Multimedia Interface) acceptă, pe un singur cablu, orice format TV sau PC video necomprimat, inclusiv semnale video standard, îmbunătățite, de înaltă definiție și 3D, până la 8 canale audio digitale comprimate sau necomprimate.HDMI (High-Definition Multimedia Interface) este un înlocuitor digital pentru standardele video analogice.

HDMI (High-Definition Multimedia Interface) implementează standardele EIA / CEA-861(Consumer Electronics Association/Electronic Industries Alliance 861 standards), care definesc formate video și forme de undă, transportul audio comprimat, necomprimat și LPCM9(Linear Pulse Code Modulation), date auxiliare și implementări ale VESA (Video Electronics Standards Association) EDID (Enhanced Extended Display Identification Data Standard). Semnalele CEA-861 purtate prin HDMI sunt compatibile cu semnalele CEA-861 utilizate de interfața vizuală digitală (DVI). Nu este necesară conversia semnalelor și nu există o pierdere a calității video atunci când se utilizează un adaptor DVI(Digital Visual Interface)-HDMI.

Lumea tehnologiei 3D digital trebuie să o înțelegem și să implementăm noi modificări pentru a merge mai departe cu 3D. Cu toate acestea, este foarte important să înțelegem natura acestei tehnologi pentru implementarea acestor schimbări.

HDMI 1.4a necesită ca afișajele 3D să susțină următoarele formate obligatorii: formatul 3D de împachetare a cadrelor la 720p60 / 50 sau 1080p24 / 25, orizontală „Side-by-Side” la 1080i60 / 50 și verticale de sus și de jos „Top-and-Bottom”  la 720p60 / 50 sau 1080p24 / 25.

Informațiile 3D sunt transmise prin mai multe metode prin transmiterea simultană a imaginilor din stânga și dreapta. Efectul vizual și metoda de televiziune 3D asupra vizualizatorului sunt identice cu tehnica 3D a cinematografului în care informațiile vizuale pentru ochiul stâng și pentru ochiul dreapt sunt transmise exact la ochiul stâng și la dreapta al vizualizatorului. Acest lucru se realizează prin expunerea cadrelor din stânga și din dreapta pe ecranul televizorului și prin deschiderea sincronă a unei căi de lumină pe ochelarii din stânga și din drepta pentru a coincide cu cadrele de pe ecranul televizorului. Pentru a afișa 60 de cadre pe secundă pentru stânga și 60 de cadre pe secundă pentru dreptul la televizorul 3D ar trebui să aibă o rată de reîmprospătare de minimum 120 Hz.

2.5.1 Transmiterea semnalului 3D pe televizor:

Metoda de ambalare a cadrelor este o metodă care descrie imaginile din stânga și din dreapta, ambalate în cadre video progresive alternând, dublând rata cadrelor de transmisie de două ori mai mare decât lățimea de bandă normală.

Pentru filmul filmat inițial la 1080p / 24-25Hz, câmpurile progresive din stânga și din dreapta sunt transmise alternativ fiecare la 24/25 Hz pentru un cadru complet 3D și o rată totală a datelor de 1080p / 48-50 Hz. Aceasta înseamnă că informația 24/25 Hz este dublată și alternată pentru fiecare imagine din stângă și din dreapta.

Pentru conținutul jocului, sa creat inițial la câmpurile 720p / 50-60Hz, câmpurile progresive din stânga și din dreapta sunt transmise alternative, așa cum este ilustrat in imaginea de mai jos, fiecare la 50-60Hz pentru un cadru 3D complet și o rată totală de date de 720p / 100-120Hz Hz pentru informațiile din stânga și dreapta dublând din nou la 50 – 60Hz rata de cadre pentru materialul alternativ din stânga și din dreapta. [23]

Figura 39. Metoda de ambalare a cadrelor [23]

2.5.2 Side-by-Side orizontal

Figura 40. Side-by-Side orizontal [23]

Există 2 versiuni diferite ale acestei metode, full sau ½. Metoda Side by Side asigură, de asemena, că rata cadrului de transmisie rămâne același cu cel al cadrului original la 60 Hz sau 50 Hz, care reprezintă o schemă mai compatibilă pentru radiodifuzorii de televiziune.

Metoda ½: pentru conținutul de transmisie la 1080i / 50-60Hz, materialul orizontal din stânga și din dreapta este sub-eșantionat la o rezoluție orizontală pe jumătate (960) și păstrat unul lângă celălalt fiind afișat uniform. Afișajul se va întinde pe fiecare latură până la lățime maximă și le va afișa secvențial.

Metodă Full: pentru conținutul de transmisie la 1080i / 50-60Hz, materialul din stâng și din drepta orizontal este afișat la rezoluția maximă (1920) și stocat alături, cu rate de cadre dublate. Afișajul se va întinde pe fiecare latură până la lățime maximă și le va afișa secvențial. [23]

2.5.3 Top and Bottom vertical

Figura 41. Top and Bottom vertical [23]

Există două versiuni diferite ale acestei metode, full sau ½. Metoda de sus și de jos asigură, de asemenea, că rata cadrului de transmisie rămâne același cu cel al cadrului original de 60 Hz sau 50 Hz, care reprezină o schemă mai compatibilă pentru radiodifuzorii de televiziune.

Metoda ½ – pentru conținutil difuzat la 1080p / 24-25Hz: materialul din stânga și din dreapta este sub-eșantionat până la jumătatea rezoluție pe axa verticală și stocat în partea superioară și inferioară. Afișajul se va întinde pe fiecare cadru la înălțimea completă și le va afișa secvențial.

Metoda ½ – pentru conținutul difuzat la 720p / 50-60Hz: materialul din stânga și din drepta este sub-eșantionat până la jumătatea rezoluție pe axa verticală și stocat în partea superioară și inferioară. Afișajul se va întinde pe fiecare cadru la înălțimea completă și le va afișa secvențial.

Metoda completă – pentru conținutul difuzat la 1080p / 24-25Hz: materialul din stânga și din dreapta este captat la rezoluția maximă pe axa verticală și stocat în partea superioară și inferioară. Afișajul va întinde fiecare cadru la înălțime completă și le va afișa secvențial cu rate de cadre dublate.

Metoda completă – pentru difuzarea conținutului la 720p / 50-60Hz: materialul din stânga și din dreapta sunt prelevate la rezoluția maximă pe axa verticală și stocate în partea superioară și inferioară. Afișajul se va întinde pe fiecare cadru la înălțime completă și le va afișa secvențial cu rate de cadre dublate. [23]

Următoarea schemă ilustrează o posibilă implementare a decodificării formatelor de ambalare a cadrelor 3D care sunt "compatibile cu serviciul" (inclusiv formatul Tile) pe un set-top-box:

Figura 42. Decodificarea formatelor de ambalare a cadrelor 3D [2]

Extended Display Identification Data (EDID) este o structură de date furnizată de un afișaj digital pentru a descrie capacitățile sale la o sursă video (de exemplu, placă grafică sau set-top box). Permite unui computer personal modern să știe ce tipuri de monitoare sunt conectate la el. EDID este definit de un standard publicat de Asociația de standarde video electronice (VESA). EDID include numele producătorului și numărul de serie, tipul de produs, tipul de fosfor sau filtru, temporizările suportate de afișaj, dimensiunea afișajului, datele de luminanță (numai pentru afișajele digitale).

Un set-top box (STB) este un dispozitiv de informație care conține în general o intrare TV-tuner și afișează ieșirea către un televizor sursa de semnal, transformând semnalul sursă într-un conținut într-o formă care poate fi apoi afișată pe ecranul televizorului sau pe un alt dispozitiv de afișare. Acestea sunt utilizate în televiziunea prin cablu, televiziunea prin satelit și în sisteme de televiziune prin satelit, precum și alte utilizări.

3. Rezultate experimentale

Pentru partea experimentală s-a realizat o aplicație mobilă Android, prin intermediul acestui proiect se urmarește formarea imaginiilor in formatele side by side și top and bottom si vizualizarea imaginiilor create in format 3D pe un display 3D sau televizoare smart 3D.

3.1 Cerințe utilizate pentru dezvoltarea aplicației Android

SDK-ul de Android, pentru care se descarcă definițiile corespunzătoare unuia sau mai multor niveluri de API – adt-bundle-windows-x86_64-20140702

Un mediu integrat de dezvoltare (IDE) – Elipse, cu plugin-ul ADT (Android Developer Tools)

un dispozitiv pe care să se ruleze aplicația:

Android Virtual Device (livrat împreună cu SDK-ul de Android)

un telefon mobil cu sistemul de operare Android pentru care s-a dezvoltat aplicația

Dispozitivul mobil pe care sa dezvoltat aplicatie este Samsung Galaxy S6 Edge

Dispozitivul pentru viziualizarea imaginiilor 3D este Sony Bravia KDL-50W685A 50" 3D 1080p HD LED LCD Internet TV

3.2 Structura proiectului

Proiectul Android are la bază un sistem de directoare ierarhizate, la fel ca și un proiect Java. Cu toate acestea, particularitățile sunt unice pentru Android. În tructura proiectului Android din fereastra Package Explorer din Eclipse vom observa o serie de directoare:

src – este directorul în care vom găsi codul Java aferent proiectului nostru

gen – în acest director, Android va stoca codul generat pentru rularea proiectului;

assets – conține toate fișierele pe care dorim să le includem în proiect;

res – este un director care conține resursele aplicației precum: elemente grafice, designul aplicației sau descrierea unor elemente din aplicație. Acesta este împărțit la rândul său în mai multe directoare: res/drawables/ – pentru imagini; res/layout/ – pentru fișiere XML care descriu interfața utilizator; res/menu/ – specificațiile XML pentru meniurile din aplicație; res/values/ – pentru șiruri de caractere, matrici sau alte elemente asemănătoare;

AndroidManifest.xml – acest fișier XML conține descrierea aplicației, ce activități, servicii include sau ce permisiuni necesită aplicația pentru a rula.

În momentul în care compilăm proiectul prin intermediul Eclipse sau orice alt IDE[1], fișierele rezultate în urma acestei acțiuni le vom găsi în directorul bin/ din rădăcina proiectului nostru, după cum urmează:

bin/namespace/ – clasele Java compilate, unde namespace reprezintă numele pachetului specificat la crearea proiectului;

bin/classes.dex – reprezintă un fișier executabil creat din clasele compilate;

bin/resources.ap_ – acest fișier este o arhivă a resurselor aplicației noastre;

bin/NumeAplicatie.apk – aceast fișier este aplicația noastră, care va fi instalată pe dispozitivul mobil.

Figura 43. Structura proiectului android in Eclipse

3.3 Interfața aplicației

În ceea ce priveste interfața aplicației, este formată dintr-o singura fereastra ce conține numele aplicației „3d Format” , este setat un background (background_4.png) care se gasește în directorul res/drawable care reprezintă un director pentru imagini, mai cuprinde și un logo (android_logo.png) care este situate tot in directorul res/drawable și două butoane : Gallery și Camera.

Prin acțiunea butonului Gallery se deschide o nouă activitate iar pentru butonul Camera deschide camera telefonul dacă dorim sa capturăm alte imagini decât cele pe care le avem stocate în galeria din telefon.

Butoanele împreună cu logo-ul sunt definite în directorul res/layout/activity_main.xml.

În sistemul Android aceste fișiere XML sunt percepute ca fiind resurse ale aplicației, așadar le vom găsi în directorul res/layout în cadrul proiectului nostru. Fiecare fișier de acest gen conține o structură ierarhică de widget-uri și containere care descriu modul în care va arăta un anumit ecran din aplicația noastră.

Fișierul care conține layout-ul nostru se numește activity_main.xml și este structurat astfel:

Figura 44. Fișierul activity_main.xml

Figura 45.Componentele interfeței ale aplicației mobile

3.4 Componentele aplicației Android

3.4.1 Activitatea Gallery

Activitatea Gallery reprezintă o componenta a aplicației Android ce oferă o interfață grafică cu care utilizatorul poate să interacționeze. Activitatea ocupă întreaga suprafață de afișare, însă acest lucru nu este obligatoriu. Aplicația android cuprinde mai multe activități care sunt conectate și comunică între ele prin activitatea principală și anume interfața aplicației care este afișată atunci când aplicația Android este lansată în execuție inițial.

Prin intermediul butonului Gallery se deschide o nouă actvitate care este reprezentată in imaginea următoare:

Figura 46. Componentele activitați Galler

Fișierul care conține layout-ul nostru și declararea elementelor din acestă interfață sunt într-un fișier XML și se numește activity_gallery.xml iar imaginiile care sunt utilizate pentru imageView se găsesc in directorul res/drawable. Toate resursele din subdirectoarele directorului res/ sunt incluse in pachetul aplicatiei de catre compilator. Pentru a facilita accesul si controlul resurselor din codul aplicatiei, compilatorul genereaza o clasa, numita R, care contine identificatori statici utilizati pentru referirea fiecarei resurse.

Conținutul ferestrei este compus din obiecte de tip View care sunt reprezentate prin două imageView care sunt redesenate cu două imagini și un buton care invocă o noua activitate. Cu ajutorul obiectului imageView utilizatorul va interacționa, și anume va deschide galeria telefonului prin intermediul careia urilizatorul își va selecta imaginiile pentru elemental din stânga si pentru elementul din dreapta. Astfel obiectul Button care este denumit în aplicație Confirm reprezintă butonul care se va utiliza și va declanșa deschiderea unei noi activități. În figura următoare este prezentată activitatea curenta si acțiunile pe care le oferă elementele din acestă fereastră.

Figura 47. Acțiunile elementelor din activity

3.4.2 Activitatea Confirm

Prin apasarea butonului Confirm se va deschide o nouă activitate iar în momentul când va fi selectat se va afisa noua activitate. O activitate poate invoca o altă activitate pentru a realiza diferite sarcini, prin intermediul unei intenții. În acest moment, activitatea veche este oprită și salvată pe stivă, după care este pornită activitatea nouă. Restaurarea și (re)începerea activității vechi este realizată în momentul în care activitatea nouă (curentă) este terminată.

În cadrul aplicație Android, o interfață grafică conține elemente care au capabilitatea de a afișa informații către utilizator, în diferite formate, respectiv de a interacționa cu acesta, preluând datele necesare realizării diverselor fluxuri operaționale din cadrul aplicației.

Există și o categorie specială de controale grafice, responsabile numai cu gestiunea mecanismului de dispunere a celorlalte componente, determinând modul în care vor fi plasate în cadrul ferestrei precum și coordonatele la care vor fi poziționate, în cazul activitați Confirm elementele din vechea activitate, care sunt reprezentate prin imaginiile selectate vor fi transmise în noua activitate doar că imaginiile o să fie suprapuse așa cum arată în figura următoare interfața activități confirm.

Figura 48. Componentele activitați Confirm

Elemente grafice sunt definite în pachetul android.widget, fiind implementate controale care implementează cele mai multe dintre funcționalitățile uzuale (controale pentru redarea de conținut multimediat imagini, filme , butoane).

Definirea elementelor componente și a modului lor de dispunere, asociat activități se găsesc în cadrul fișierului activity_confirm.xml.

Fiecare control din cadrul interfeței grafice va fi reprezentat printr-un element corespunzător, denumirea acestuia fiind identică cu cea a clasei care îi implementează funcționalitatea (de regulă, din pachetul android.widget).

Elementele interfeței grafice sunt caracterizate prin anumite proprietăți, cum ar fi poziționarea, dimensiunile, conținutul pe care îl afișează, tipurile de date acceptate de la utilizator, informațiile ajutătoare.

Pentru fiecare control a fost specificat (manual, prin apelul metodei corespunzătoare) diferitele caracteristici, asociindu-i-se și un identificator (uzual, acesta poate fi orice număr întreg).

De exemplu elementul de control buton cu denumirea „Select 3D Format”, prin inițierea unei acțiuni o sa afișeze un meniu pop – up care cuprinde tipurile pentru implementarea imaginiilor selectate pentru a le transforma în formatele side-by-side, top-and-bottom.

Elementul grafic imageView, al activități confirm permite utilizatorului viziualizare imaginiilor selectate dar si viziualizare imaginiilor după ce au fost transformate în formatul dorit.

Figura 49. Meniu pop-up

După afișarea meniului pop-up, utilizatorul aplicației poate selecta formatul dorit pentru afisarea imaginiilor iar formatul selectat va putea fi vizualizat prin intermediul elemetului imageView.

Figura 50. Selectarea formatului

După efectuarea operatiuniilor, elementele grafice vor fi afișate în activitatea confirm cum arată în figura următoare.

Figura 51. Afișarea formatului selectat

Interfața grafica pentru activitatea confirm mai dispune tot de un element de tipul buton care este denumit „Save image”, care permite uilizatorului salvarea imagini pe dispozitivul mobil, imaginia va fi stocată în galeria telefonului mobil, utilizatorul va primi un mesaj afișat pe ecranul telefonului cu calea unde a fost stocată imaginea.

Figura 52. Salvarea imagini

Pentru a putea vizualiza imaginea în formatul 3D side by side sau top and bottom am utilizat un televizor Sony Bravia KDL-50W685A 50" 3D 1080p HD LED LCD Internet TV. Elementul final și anume imaginea salvată pe dispozitivul mobil poate fi redată pe un dispozitiv care aigură support pentru a reda 3D.

Figura 53. Selectarea vizualizari pe TV

Figura 54. Afișarea imaginii

Figura 55. Afișare opțiune 3D

Figura 56. Selectare 3D top and bottom

Figura 57. Imaginea în format 3D

4.Concluzie

Formatul 3D Tile este o nouă formă de difuzare 3D care este pe deplin compatibilă cu afișajele de televiziune 2D, permițând vizualizarea 3D și 2D a unui singur flux de difuzare. Utilizează o tehnică inovatoare pentru formatarea imaginilor stereoscopice care integrează două cadre 720p într-un singur cadru 1080p. Imaginile reconstituite din dreapta și din stânga mențin o rezoluție spațială și temporală totală de 720p, oferind spectatorilor ambelor versiuni beneficiul maxim al imaginii originale.

Formatul 3D Tile, de asemenea, promite să asigure o calitate mai bună a transmisiilor conținutului 3D decât soluțiile actuale și, deoarece este compatibil înapoi, permite radiodifuzorilor să transmită atât utilizatorilor 2D cât și celor 3D, fără a fi nevoie de o lărgime de bandă crescută.

Tile Format (TF) poate fi o soluție valabilă pentru a oferi un serviciu TV 3D compatibil 3D și 2D. Concluziile noastre sunt susținute pe partea experimentală cu analiza calității imaginii obținute după comprimarea formatului compatibil propus.

Tabelul 3 de mai sus rezumă valorile rezoluției NV verticale și orizontale NH calculate pentru sistemele 2D HD și 3D HD disponibile în prezent. Semnul ne reamintește faptul că valorile rezoluției sunt extrem de dependente de valorile atribuite „factorilor Kell” (orizontal și vertical) și de „factorul Interlace”.

Datele prezentate în Tabelul 3 pentru formatele SbS și TaB arată diferența semnificativă dintre cele două rezoluții. Evaluarea generală a spectatorului ar putea fi influențată de cel mai mic dintre cele două rezoluții: ar fi necesare investigații suplimentare pentru a confirma această ipoteză. Fără îndoială, totuși, cei mai buni sunt cei care păstrează echilibrul dintre cele două rezoluții.

Acest studiu a investigat stadiul tehnologiilor de ambalare 3D, tehnicile de interconectare verticale asociate și a subliniat importanța și impactul acestei tehnologii asupra performanței sistemelor. Acest lucru a fost demonstrat printr-o colecție de sisteme diferite care au fost implementate utilizând această tehnologie de ambalare. Din aceste sisteme, nu există nicio îndoială că ambalajul 3D îmbunătățește performanța sistemului și reduce dimensiunea, greutatea, întârzierea, consumul de energie etc. Se crede că tehnologia de ambalare 3D este o necesitate pentru implementarea majorității sistemelor de înaltă performanță, deoarece reprezintă o cheie a dezvoltării sistemelor microelectronice avansate, cu dimensiuni reduse, greutate redusă și cerințe de putere redusă. Chiar dacă tehnologia de ambalare 3D oferă multe avantaje față de tehnologiile de ambalare convenționale, aceasta adaugă mai multe provocări la proiectarea sistemului în ceea ce privește managementul termic și complexitatea sistemului. Se așteaptă ca aceste provocări să se reducă semnificativ odată cu avansarea tehnologiilor de ambalare.

Costul și termenul de livrare sunt alte tipuri de provocări care au apărut din cauza costului ridicat al infrastructurii necesare pentru ambalarea 3D și a reticenței companiilor de producție de a exploata această tehnologie. Ultimele două provocări se vor ușura, atunci când companiile de producție își dau seama că nu pot evita recurgerea la tehnologia 3D în proiectarea sistemelor de înaltă performanță.

După controlul variabilelor de utilizare, sa constatat că diferența procentuală a consumului de energie între 2D și 3D a variat de la o scădere de 19% la o creștere de 72%.
În timp ce în unele cazuri consumul de energie a scăzut, 10 din cele 12 televizoare testate au prezentat o creștere a consumului de energie de la 2D la 3D. Gradul în care televizorul a crescut la putere depinde în mare măsură de dimensiunea ecranului și de tehnologia ecranului televizorului. În plus, studiul constată că tehnologia 3D a televizorului, activă sau pasivă 3D, nu are un impact prea mic asupra diferențelor de consum de energie între 2D și 3D.

Deși în prezent nu există proceduri standard de testare pentru măsurarea consumului de energie 3D, procedurile existente în industrie pentru televizoarele 2D pot servi ca îndrumări în testarea 3D.

Formatele video 3D au evoluat de la un video stereo simplu la un multi-view plus adâncime, ceea ce duce la o cantitate imensă de date codificate.

5.Bibliografie

6. Anexe

Codul sursă

În acest capitol este prezentat codul sursă al aplicției.

MainActivity.java

public class MainActivity extends Activity {

Button b1; // declarare variabile

Button b2; // declarare variabile

protected void onCreate(Bundle savedInstanceState) { // inițializați activitatea

super.onCreate(savedInstanceState); // start activity

setContentView(R.layout.activity_main);

b1=(Button)findViewById(R.id.button_1); // declarare variabilele de vizualizare

b1.setOnClickListener(new View.OnClickListener(){ // start metodei setOnClickListener

public void onClick(View v) { // se apelează când a fost făcută clic pe un element de vizualizare

Intent i = new Intent(MainActivity.this, Gallery.class);// metoda este utilizată pentru a începe o nouă activitate

startActivity(i);

}

}); // se închide metoda setOnClickListener

b2=(Button)findViewById(R.id.button_2); // declarare variabilele de vizualizare

b2.setOnClickListener(new View.OnClickListener() { // start metodei setOnClickListener

public void onClick(View v) { // se apelează când a fost făcută clic pe un element de vizualizare

// acțiunea intenționată care poate fi trimisă pentru ca aplicația camerei să capteze o imagine și să o returneze

Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);

startActivityForResult(intent, 0);

}

}); // se închide metoda setOnClickListener

}

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:paddingBottom="@dimen/activity_vertical_margin"

android:paddingLeft="@dimen/activity_horizontal_margin"

android:paddingRight="@dimen/activity_horizontal_margin"

android:paddingTop="@dimen/activity_vertical_margin"

android:background="@drawable/background_3"

tools:context="com.example.d_app.MainActivity" >

<Button

android:id="@+id/button_1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentBottom="true"

android:layout_centerHorizontal="true"

android:layout_marginBottom="103dp"

android:background="@drawable/btn_1"

android:minWidth="250dp"

android:textSize="35sp"

android:textColor="#ffffff"

android:textStyle="bold"

android:text="@string/button_1" />

<Button

android:id="@+id/button_2"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentBottom="true"

android:layout_centerHorizontal="true"

android:layout_marginBottom="50dp"

android:background="@drawable/btn_2"

android:minWidth="250dp"

android:textSize="35sp"

android:textColor="#ffff0000"

android:textStyle="bold"

android:text="@string/button_2" />

<ImageView

android:id="@+id/imageView1"

android:layout_width="300dp"

android:layout_height="300dp"

android:layout_alignParentTop="true"

android:layout_centerHorizontal="true"

android:layout_marginTop="18dp"

android:contentDescription="@string/none"

android:src="@drawable/android_logo" />

</RelativeLayout>

Gallery.java

public class Gallery extends Activity {

Button button1; // declarare variabile

ImageView imageview1, imageview2; // declarare variabile

Bitmap bitmap1; // declarare variabile

Bitmap bitmap2; // declarare variabile

Uri image_URI_L; // declarare variabile

Uri image_URI_R; // declarare variabile

int imageSizeToShow = 1080; // declarare variabile

// se crează o implementare pentru OnClickListener

OnClickListener mClickListener = new OnClickListener() {// se pornește metoda setOnClickListener

public void onClick(View v) { // se apelează când a fost făcută clic pe un element de vizualizare

if (v.getId() == R.id.imageview1) { // se obține ID-ul de vizualizare cănd este o acțiune

// se utilizează pentru a începe o nouă activitate și a deschide o imagine

// folosind android.intent.action.PICK

Intent intent_gal_left = new Intent("android.intent.action.PICK");

intent_gal_left.setType("image/*");

startActivityForResult(intent_gal_left, 1);

return;

}

else if (v.getId() == R.id.imageview2) { // se obține ID-ul de vizualizare cănd este o acțiune

// se utilizează pentru a începe o nouă activitate și a deschide o imagine

// folosind android.intent.action.PICK

Intent intent_gal_right = new Intent("android.intent.action.PICK");

intent_gal_right.setType("image/*");

startActivityForResult(intent_gal_right, 2);

return;

}

else if (v.getId() == R.id.button1) { // se obține ID-ul de vizualizare cănd este o acțiune

if (Gallery.this.image_URI_L != null && Gallery.this.image_URI_R != null) {

//se crează un obiect Bundle

Bundle b = new Bundle();

/// asociați datele la String

b.putString("img0", image_URI_L.toString()); // se trimite left img, uri.toString () va returna un conținut

b.putString("img1", image_URI_R.toString()); // se trimite right img, uri.toString () va returna un conținut

// start următoarea activity

startActivity(new Intent(Gallery.this, Confirm.class).putExtras(b));

// se crează mesajul toast care este un mesaj care apare și dispare de la sine

Toast.makeText(getApplicationContext(), "Done",Toast.LENGTH_LONG).show();

}else{

Toast.makeText(getApplicationContext(), "Something wrong in processing!", Toast.LENGTH_LONG).show();

}

}

}

}; // se închide metoda setOnClickListeners

protected void onCreate(Bundle savedInstanceState) { // inițializați activitatea

super.onCreate(savedInstanceState); // start activity

setContentView(R.layout.activity_gallery);

// se capturează imageView din schemă

imageview1 = (ImageView) findViewById(R.id.imageview1);

imageview2 = (ImageView) findViewById(R.id.imageview2);

//se înregistrează imageView onClick cu implementarea de mai sus

imageview1.setOnClickListener(mClickListener);

imageview2.setOnClickListener(mClickListener);

// Setează un conținut drawable cu conținutul acestei imagini

imageview1.setImageResource(R.drawable.talk_touch_left);

imageview2.setImageResource(R.drawable.talk_touch_right);

//se capturează butonul din schemă

Button button1 = (Button) findViewById(R.id.button1);

// Register the onClick listener with the implementation above

button1.setOnClickListener(mClickListener);

}

// se apelează metoda pentru a primi mesajul dintr-o altă activitate (deschideți galeria telefonică)

public void onActivityResult(int requestCode, int resultCode, Intent data) {

super.onActivityResult(requestCode, resultCode, data);

if (resultCode != -1) {

return;

}

// dacă utilizatorul a încercat să selecteze o imagine

if (requestCode == 1) {

try

image_URI_L = data.getData(); // acesta primește URI-ul imaginii pe care a ales-o utilizatorul

setImageView_L();

} catch (Exception e) {

e.printStackTrace();

}

// dacă utilizatorul a încercat să selecteze o imagine

} else if (requestCode == 2) {

try {

image_URI_R = data.getData(); // acesta primește URI-ul imaginii pe care a ales-o utilizatorul

setImageView_R();

} catch (Exception e2) {

e2.printStackTrace();

}

} else if (requestCode == 1001) {

// se obține rezultatul din Galerie

image_URI_L = data.getData(); // acesta primește URI-ul imaginii pe care a ales-o utilizatorul

image_URI_R = Uri.parse(data.getStringExtra("right_pic"));

if (image_URI_L == null || image_URI_R == null);

}

}

private void setImageView_L() {

if (bitmap1 != null) {

bitmap1.recycle();

bitmap1 = null;

}

// Obține calea pentru imaginea URI și se rotește prin metoda GetRotatedBitmap

bitmap1 = GetRotatedBitmap(getRealPathFromUri(getApplicationContext(), image_URI_L),

imageSizeToShow);

// se setează bitmap1 la imageview1

imageview1.setImageBitmap(bitmap1);

}

private void setImageView_R() {

if (bitmap2 != null) {

bitmap2.recycle();

bitmap2 = null;

}

// Obține calea pentru imaginea URI și se rotește prin metoda GetRotatedBitmap

bitmap2 = GetRotatedBitmap( getRealPathFromUri(getApplicationContext(), image_URI_R),

imageSizeToShow);

// se setează bitmap2 la imageview2

imageview2.setImageBitmap(bitmap2);

}

// Creează metoda GetRotatedBitmap și se obține un Bitmap din calea de la fișier

// filepath este un obiect care poate fi folosit pentru a localiza un fișier într-un sistem de fișiere

private Bitmap GetRotatedBitmap(String bitmap_filepath, int maxResolution) {

// se crează o matrice pentru manipulare

Matrix matrix = new Matrix();

try {

// se citește etichete Exif din fișierul imaginii specificate

// pentru orientarea imaginii

int orientation = new ExifInterface(bitmap_filepath)

.getAttributeInt("Orientation", 1);

if (orientation == 6) {

// se setează valoarea rotației imaginii la 90 de grade în matrice

matrix.postRotate(90.0f);

} else if (orientation == 3) {

// se setează valoarea rotației imaginii la 180 de grade în matrice

matrix.postRotate(180.0f);

} else if (orientation == 8) {

// se setează valoarea rotației imaginii la 270 de grade în matrice

matrix.postRotate(270.0f);

} else {

matrix.postRotate(0.0f);

}

} catch (Exception e) {

matrix.postRotate(0.0f);

}

Options bitOption = new Options();

// Options reprezintă o colecție de obiecte Option

bitOption.inSampleSize = getSampleSize(getBitmapMaxLength(bitmap_filepath), maxResolution);

// determina dimensiunea și lungimea imaginii

// mai întâi se decodifică imaginea pentru a verifica dimensiunile

Bitmap myBitmap = BitmapFactory.decodeFile(bitmap_filepath);

return Bitmap.createBitmap(myBitmap, 0, 0, myBitmap.getWidth(),

myBitmap.getHeight(), matrix, true);

}

//se crează metoda getSampleSize pentru a determina dimensiunea imaginii

// pentru a obține dimensiunea eșantionului

private int getSampleSize(int desired_width, int image_width) {

// se calculează SampleSize

int SampleSize = 1; // Dimensiunea implicită a subsamblării

// dacă lățimea dorită este mai mică decât lățimea imaginii

if (desired_width < image_width) {

int i = 0;

while (i < 10) {

// returnează valoarea primului argument ridicat la puterea celui de-al doilea argument

//se calculează valoarea cea mai mare din SampleSize care are o putere de 2 și o lățime mai mare decât cea cerută și lățimea

if (((int) Math.pow(2.0d, (double) i)) * desired_width < image_width && ((int) Math.pow(2.0d, (double) (i + 1))) * desired_width >= image_width) {

SampleSize = (int) Math.pow(2.0d, (double) (i + 1));

i = 1000;

}

i++;

}

}

return SampleSize;

}

public static int getBitmapMaxLength(String fileName) {

try {

// se decodează inJustDecodeBounds=true pentru a verifica dimensiunile

Options options = new Options();

options.inJustDecodeBounds = true;

// se decodează pentru a verifica dimensiunile

BitmapFactory.decodeFile(fileName, options);

// înălțimea reală și lățimea imaginii

int h = options.outHeight;

int w = options.outWidth;

// alege cel mai mic raport în valoarea cu SampleSize, ceea ce va garanta

// o imagine finală cu ambele dimensiuni mai mari sau egale cu

// înălțime și lățime cerută

return h > w ? h : w;

} catch (Exception e) {

return 0;

}

}

// se convertește URI-ul imaginii în calea directă a sistemului de fișiere din fișierul imaginii

private String getRealPathFromUri(Context context, Uri uri) {

return FileUtils.getPath(context, uri);

}

}activity_gallery.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="@drawable/background_3"

android:paddingBottom="@dimen/activity_vertical_margin"

android:paddingLeft="@dimen/activity_horizontal_margin"

android:paddingRight="@dimen/activity_horizontal_margin"

android:paddingTop="@dimen/activity_vertical_margin"

tools:context="com.example.d_app.Gallery" >

<Button

android:id="@+id/button1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerHorizontal="true"

android:layout_centerVertical="true"

android:background="@drawable/btn_3"

android:textSize="35sp"

android:textColor="#FFFFFF"

android:textStyle="bold"

android:minWidth="250dp"

android:text="@string/button1" />

<ImageView

android:id="@+id/imageview2"

android:layout_width="225dp"

android:layout_height="200dp"

android:layout_alignLeft="@+id/imageview1"

android:layout_alignParentBottom="true"

android:adjustViewBounds="true"

android:contentDescription="@string/none"

android:src="@drawable/talk_touch_right" />

<ImageView

android:id="@+id/imageview1"

android:layout_width="225dp"

android:layout_height="200dp"

android:layout_alignLeft="@+id/button1"

android:layout_alignParentTop="true"

android:adjustViewBounds="true"

android:contentDescription="@string/none"

android:src="@drawable/talk_touch_left" />

</RelativeLayout>

FileUtils.java

public class FileUtils {

private FileUtils() {

}

@TargetApi(19)

// se obține numele fișierului și calea din URI

public static String getPath(Context context, android.net.Uri uri) {

// se verifică dacă dispozitivul curent rulează unele versiuni Android

boolean isKitKat;

if (VERSION.SDK_INT >= 19) {

isKitKat = true;

} else {

isKitKat = false;

}

// Document Provider

if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {

String[] split = null;

// ExternalStorage Provider

if (isExternalStorageDocument(uri)) {

split = DocumentsContract.getDocumentId(uri).split(":");

if ("primary".equalsIgnoreCase(extracted(split)[0])) {

return Environment.getExternalStorageDirectory() + "/" + extracted(split)[1];

}

return null;

// Downloads Provider

} else if (isDownloadsDocument(uri)) {

return getDataColumn(context, ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(DocumentsContract.getDocumentId(uri)).longValue()), null, null);

// Media Provider

} else if (!isMediaDocument(uri)) {

return null;

} else {

String type = DocumentsContract.getDocumentId(uri).split(":")[0];

Uri contentUri = null;

if ("image".equals(type)) {

contentUri = Media.EXTERNAL_CONTENT_URI;

} else if ("video".equals(type)) {

contentUri = Video.Media.EXTERNAL_CONTENT_URI;

} else if ("audio".equals(type)) {

contentUri = Audio.Media.EXTERNAL_CONTENT_URI;

}

return getDataColumn(context, contentUri, "_id=?", new String[]{extracted(split)[1]});

}

// Media Store

} else if ("content".equalsIgnoreCase(uri.getScheme())) {

if (isGooglePhotosUri(uri)) {

return uri.getLastPathSegment();

}

// File

return getDataColumn(context, uri, null, null);

} else if ("file".equalsIgnoreCase(uri.getScheme())) {

return uri.getPath();

} else {

return null;

}

}

private static String[] extracted(String[] split) {

return split;

}

// se obține valoarea coloanei de date pentru acest Uri. Acest lucru este util pentru

// MediaStore Uris și alți furnizori de conținut pe bază de fișiere

// se convertește URI-ul imaginii în calea directă a sistemului de fișiere din fișierul imaginii

public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {

Cursor cursor = null;

try {

cursor = context.getContentResolver().query(uri, new String[]{"_data"}, selection, extracted(selectionArgs), null);

if (cursor == null || !cursor.moveToFirst()) {

if (cursor != null) {

cursor.close();

}

return null;

}

String string = cursor.getString(cursor.getColumnIndexOrThrow("_data"));

return string;

} finally {

if (cursor != null) {

cursor.close();

}

}

}

//se verifica URI

// se returnează dacă Uri este în ExternalStorageProvider

public static boolean isExternalStorageDocument(Uri uri) {

return "com.android.externalstorage.documents".equals(uri.getAuthority());

}

//se verifica URI

// se returnează dacă Uri este în DownloadsProvider.

public static boolean isDownloadsDocument(Uri uri) {

return "com.android.providers.downloads.documents".equals(uri.getAuthority());

}

//se verifica URI

// se returnează dacă Uri este în MediaProvider.

public static boolean isMediaDocument(Uri uri) {

return "com.android.providers.media.documents".equals(uri.getAuthority());

}

//se verifica URI

// se returnează dacă Uri este în Google Photos.

public static boolean isGooglePhotosUri(Uri uri) {

return "com.google.android.apps.photos.content".equals(uri.getAuthority());

}

}

Confirm.java

public class Confirm extends Activity {

ImageView imageadjust; // declarare variabile

String img0 = ""; // declarare variabile

String img1 = ""; // declarare variabile

Button button1; // declarare variabile

Button button2; // declarare variabile

int imageSizeToShow = 1080; // declarare variabile

protected void onCreate(Bundle savedInstanceState) { // inițializați activitatea

super.onCreate(savedInstanceState); // start activity

setContentView(R.layout.activity_confirm);

// se capturează imageView din schemă

imageadjust = (ImageView) findViewById(R.id.imageadjust);

Bundle b = getIntent().getExtras(); // se obține valoare

if (b != null) {

img0 = b.getString("img0"); // se obține valoare

img1 = b.getString("img1"); // se obține valoare

}

//processedBitmap apelează metoda ProcessingBitmap()

Bitmap processedBitmap = ProcessingBitmap();

if (processedBitmap != null) {

// se setează processedBitmap la imageadjust

imageadjust.setImageBitmap(processedBitmap);

}

//se capturează butonul din schemă

button1 = (Button) findViewById(R.id.button_3);

button1.setOnClickListener(new OnClickListener() {

// start metodei setOnClickListener

public void onClick(View v) { // se apelează când a fost făcută clic pe un element de vizualizare

//se crează instanță de PopupMenu

PopupMenu popup = new PopupMenu(Confirm.this, button1);

try {

Field[] fields = popup.getClass().getDeclaredFields();

for (Field field : fields) {

if ("mPopup".equals(field.getName())) {

field.setAccessible(true);

Object menuPopupHelper = field.get(popup);

Class<?> classPopupHelper = Class.forName(menuPopupHelper.getClass().getName());

Method setForceIcons = classPopupHelper.getMethod("setForceShowIcon", boolean.class);

setForceIcons.invoke(menuPopupHelper, true);

break;

}

}

} catch (Exception e) {

e.printStackTrace();

}

// Inflating the Popup using xml file

popup.getMenuInflater().inflate(R.menu.popup_menu,

popup.getMenu());

// se înregistrează pop-up cu OnMenuItemClickListener

popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { // start metodei OnMenuItemClickListener()

public boolean onMenuItemClick(MenuItem item) { // se apelează când a fost făcută clic pe un element de vizualizare

if (item.getItemId() == R.id.one) { // se obține ID-ul de vizualizare cănd este o acțiune

//comboBitmap apelează metoda mergeBitmap()

Bitmap comboBitmap = mergeBitmap();

if (comboBitmap != null) {

//se setează comboBitmap la imageadjust imageadjust.setImageBitmap(Bitmap.createScaledBitmap(comboBitmap, 1280,720, false));

// se crează mesajul toast care este un mesaj care apare și dispare de la sine

Toast.makeText(Confirm.this,"Clicked Side-by-side 720",Toast.LENGTH_SHORT).show();

return true;

}

}

else if (item.getItemId() == R.id.two) { // se obține ID-ul de vizualizare cănd este o acțiune //comboBitmap1 apelează metoda mergeBitmap1()

Bitmap comboBitmap1 = mergeBitmap1();

if (comboBitmap1 != null) {

// se setează comboBitmap1 la imageadjust imageadjust.setImageBitmap(Bitmap.createScaledBitmap(comboBitmap1,1920,1080, false));

// se crează mesajul toast care este un mesaj care apare și dispare de la sine

Toast.makeText(Confirm.this,"Clicked Side-by-side 1080",Toast.LENGTH_SHORT).show();

return true;

}

}

else if (item.getItemId() == R.id.three) { // se obține ID-ul de vizualizare cănd este o acțiune

//topBitmap apelează metoda topandbottomBitmap()

Bitmap topBitmap = topandbottomBitmap();

if (topBitmap != null) {

// se setează topBitmap la imageadjust

imageadjust.setImageBitmap(Bitmap.createScaledBitmap(topBitmap,1280,720, false));

// se crează mesajul toast care este un mesaj care apare și dispare de la sine

Toast.makeText(Confirm.this,"Clicked Top and Bottom 720",Toast.LENGTH_SHORT).show();

return true;

}

}

else if (item.getItemId() == R.id.four) { // se obține ID-ul de vizualizare cănd este o acțiune

//topBitmap1 apelează metoda topandbottomBitmap1()

Bitmap topBitmap1 = topandbottomBitmap1();

if (topBitmap1 != null) {

// se setează topBitmap1 la imageadjust imageadjust.setImageBitmap(Bitmap.createScaledBitmap(topBitmap1,1920,1080, false));

// se crează mesajul toast care este un mesaj care apare și dispare de la sine

Toast.makeText(Confirm.this,"Clicked Top and Bottom 1080",Toast.LENGTH_SHORT).show();

return true;

}

}

else if (item.getItemId() == R.id.five) { // se obține ID-ul de vizualizare cănd este o acțiune

//topBitmap1 apelează metoda topandbottomBitmap1()

Bitmap newBitmap1 = ProcessingBitmap1();

if (newBitmap1 != null) {

//se setează newBitmap1 la imageadjust

imageadjust.setImageBitmap(newBitmap1);

// se crează mesajul toast care este un mesaj care apare și dispare de la sine

Toast.makeText(Confirm.this,"Clicked Interlaced",Toast.LENGTH_SHORT).show();

return true;

}

}

return true;

}

});

popup.show(); // showing popup menu

}

}); // se închide metoda setOnClickListeners

//se capturează butonul din schemă

button2 = (Button) findViewById(R.id.button_4);

button2.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) { // se obține ID-ul de vizualizare cănd este o acțiune

// drawables with theme attributes

BitmapDrawable drawable = (BitmapDrawable) imageadjust.getDrawable();

Bitmap bitmap = drawable.getBitmap();

// metoda getContentResolver () este folosită atunci când interogați un Conținut, utilizând un obiect Cursor

ContentResolver cr = getContentResolver();

String title = "myBitmap";

String description = "My bitmap created by Android-er";

String savedURL = MediaStore.Images.Media.insertImage(cr,bitmap, title, description);

// se crează mesajul toast care este un mesaj care apare și dispare de la sine

Toast.makeText(Confirm.this, savedURL, Toast.LENGTH_LONG).show();

}

});

}

//se crează metoda ProcessingBitmap()

private Bitmap ProcessingBitmap() {

Bitmap bitmap1 = null; //declare variables

Bitmap bitmap2 = null; //declare variables

Bitmap newBitmap = null; //declare variables

try {

bitmap1 = BitmapFactory.decodeStream(getContentResolver()

.openInputStream(Uri.parse(img0)));

// pentru a prelua date dintr-un URI de conținut

bitmap2 = BitmapFactory.decodeStream(getContentResolver()

.openInputStream(Uri.parse(img1)));

// pentru a prelua date dintr-un URI de conținut

// se obține o cale din imaginea URI și se rotește cu metoda GetRotatedBitmap

bitmap1 = GetRotatedBitmap(getRealPathFromUri(getApplicationContext(), Uri.parse(img0)), this.imageSizeToShow);

bitmap2 = GetRotatedBitmap(getRealPathFromUri(getApplicationContext(), Uri.parse(img1)), this.imageSizeToShow);

int w; // se declară variabila locală, se obține lățimea de la bitmap

if (bitmap1.getWidth() >= bitmap2.getWidth()) {

w = bitmap1.getWidth();

} else {

w = bitmap2.getWidth();

}

int h; // se declară variabila locală, se obține înălțimea de la bitmap

if (bitmap1.getHeight() >= bitmap2.getHeight()) {

h = bitmap1.getHeight();

} else {

h = bitmap2.getHeight();

}

// se creează newBitmap, Bitmap.Config.ARGB_8888 este un format de 32 de biți, fiecare pixel este stocat pe 4 octeți

newBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);

// se crează un nouCanvas

Canvas newCanvas = new Canvas(newBitmap);

// gata să atragă acel bitmap prin acea pânză

// se crează o matrice pentru manipulare

Matrix matrix = new Matrix();

// matricea cu translație specificată

matrix.preTranslate(20, 5);

matrix.postTranslate(5, 0);

// matricea cu scara specificata

matrix.postScale(1,1);

newCanvas.drawBitmap(bitmap1, matrix, null);

//se crează un nou Paint cu setările implicite

Paint paint = new Paint();

paint.setAlpha(128);

// gata să atragă acel bitmap prin acea pânză

newCanvas.drawBitmap(bitmap2, 0, 0, paint);

} catch (FileNotFoundException e) {

e.printStackTrace();

}

return newBitmap;

}

//se crează metoda Bitmap mergeBitmap()

public Bitmap mergeBitmap() {

Bitmap bitmap1 = null; // declarare variabile

Bitmap bitmap2 = null; // declarare variabile

Bitmap comboBitmap = null; // declarare variabile

try {

bitmap1 = BitmapFactory.decodeStream(getContentResolver()

.openInputStream(Uri.parse(img0)));

// pentru a prelua date dintr-un URI de conținut

bitmap2 = BitmapFactory.decodeStream(getContentResolver()

.openInputStream(Uri.parse(img1)));

// pentru a prelua date dintr-un URI de conținut

// se obține o cale din imaginea URI și se rotește cu metoda GetRotatedBitmap

bitmap1 = GetRotatedBitmap(getRealPathFromUri(getApplicationContext(), Uri.parse(img0)), this.imageSizeToShow);

bitmap2 = GetRotatedBitmap(getRealPathFromUri(getApplicationContext(), Uri.parse(img1)), this.imageSizeToShow);

//se creează un bitmap scalat

Bitmap.createScaledBitmap(bitmap1, 640, 720, false);

Bitmap.createScaledBitmap(bitmap2, 640, 720, false);

// se declară variabila locală, se obține lățimea de la bitmap

int width = bitmap1.getWidth() + bitmap2.getWidth();

// se declară variabila locală, se obține înălțimea de la bitmap

int height = bitmap1.getHeight();

// se creează comboBitmap, Bitmap.Config.ARGB_8888 este un format de 32 de biți, fiecare pixel este stocat pe 4 octeți

comboBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);

// se crează un nouCanvas

Canvas comboImage = new Canvas(comboBitmap);

// gata să atragă acel bitmap prin acea pânză

// se crează o matrice pentru manipulare

Matrix matrix = new Matrix();

// matricea cu translație specificată

matrix.preTranslate(20, 5);

matrix.postTranslate(5, 0);

// matricea cu scara specificata

matrix.postScale(1,1);

// gata să atragă acel bitmap prin acea pânză

comboImage.drawBitmap(bitmap1, matrix, null);

comboImage.drawBitmap(bitmap2,bitmap1.getWidth(), 0f , null);

} catch (FileNotFoundException e) {

e.printStackTrace();

}

return comboBitmap;

}

//se crează metoda Bitmap mergeBitmap1()

public Bitmap mergeBitmap1() {

Bitmap bitmap1 = null; // declarare variabile

Bitmap bitmap2 = null; // declarare variabile

Bitmap comboBitmap1 = null; // declarare variabile

try {

bitmap1 = BitmapFactory.decodeStream(getContentResolver()

.openInputStream(Uri.parse(img0)));

// pentru a prelua date dintr-un URI de conținut

bitmap2 = BitmapFactory.decodeStream(getContentResolver()

.openInputStream(Uri.parse(img1)));

// pentru a prelua date dintr-un URI de conținut

// se obține o cale din imaginea URI și se rotește cu metoda GetRotatedBitmap

bitmap1 = GetRotatedBitmap(getRealPathFromUri(getApplicationContext(), Uri.parse(img0)), this.imageSizeToShow);

bitmap2 = GetRotatedBitmap(getRealPathFromUri(getApplicationContext(), Uri.parse(img1)), this.imageSizeToShow);

//se creează un bitmap scalat

Bitmap.createScaledBitmap(bitmap1, 960, 1080, false);

Bitmap.createScaledBitmap(bitmap2, 960, 1080, false);

// se declară variabila locală, se obține lățimea de la bitmap

int width = bitmap1.getWidth() + bitmap2.getWidth();

// se declară variabila locală, se obține înălțimea de la bitmap

int height = bitmap1.getHeight();

// se creează comboBitmap1, Bitmap.Config.ARGB_8888 este un format de 32 de biți, fiecare pixel este stocat pe 4 octeți

comboBitmap1 = Bitmap.createBitmap(width, height,Bitmap.Config.ARGB_8888);

// se crează un nouCanvas

Canvas comboImage = new Canvas(comboBitmap1);

// gata să atragă acel bitmap prin acea pânză

// se crează o matrice pentru manipulare

Matrix matrix = new Matrix();

// matricea cu translație specificată

matrix.preTranslate(20, 5);

matrix.postTranslate(5, 0);

// matricea cu scara specificata

matrix.postScale(1,1);

// gata să atragă acel bitmap prin acea pânză

comboImage.drawBitmap(bitmap1, matrix, null);

comboImage.drawBitmap(bitmap2, bitmap1.getWidth(), 0f, null);

} catch (FileNotFoundException e) {

e.printStackTrace();

}

return comboBitmap1;

}

//se crează metoda topandbottomBitmap()

public Bitmap topandbottomBitmap() {

Bitmap bitmap1 = null; // declarare variabile

Bitmap bitmap2 = null; // declarare variabile

Bitmap topBitmap = null; // declarare variabile

try {

bitmap1 = BitmapFactory.decodeStream(getContentResolver()

.openInputStream(Uri.parse(img0)));

// pentru a prelua date dintr-un URI de conținut

bitmap2 = BitmapFactory.decodeStream(getContentResolver()

.openInputStream(Uri.parse(img1)));

// pentru a prelua date dintr-un URI de conținut

// se obține o cale din imaginea URI și se rotește cu metoda GetRotatedBitmap

bitmap1 = GetRotatedBitmap(getRealPathFromUri(getApplicationContext(), Uri.parse(img0)), this.imageSizeToShow);

bitmap2 = GetRotatedBitmap(getRealPathFromUri(getApplicationContext(), Uri.parse(img1)), this.imageSizeToShow);

//se creează un bitmap scalat

Bitmap.createScaledBitmap(bitmap1, 1280, 360, false);

Bitmap.createScaledBitmap(bitmap2, 1280, 360, false);

// se declară variabila locală, se obține lățimea de la bitmap

int width = bitmap1.getWidth();

// se declară variabila locală, se obține înălțimea de la bitmap

int height = bitmap2.getHeight() + bitmap1.getHeight();

//se creează topBitmap, Bitmap.Config.ARGB_8888 este un format de 32 de biți, fiecare pixel este stocat pe 4 octeți

topBitmap = Bitmap.createBitmap(width, height,Bitmap.Config.ARGB_8888);

// se crează un nouCanvas

Canvas comboImage = new Canvas(topBitmap);

// gata să atragă acel bitmap prin acea pânză

// se crează o matrice pentru manipulare

Matrix matrix = new Matrix();

matrix.preTranslate(-40, -5);

matrix.postTranslate(35,0);

// matricea cu scara specificata

matrix.postScale(1,1);

comboImage.drawBitmap(bitmap1, matrix, null);

// matricea cu translație specificată

Matrix matrix1= new Matrix();

matrix1.preTranslate(0, 5);

matrix1.postTranslate(5, bitmap1.getHeight());

// matricea cu scara specificata

matrix1.postScale(1,1);

// gata să atragă acel bitmap prin acea pânză

comboImage.drawBitmap(bitmap2, matrix1, null);

} catch (FileNotFoundException e) {

e.printStackTrace();

}

return topBitmap;

}

//se crează metoda topandbottomBitmap1()

public Bitmap topandbottomBitmap1() {

Bitmap bitmap1 = null; // declarare variabile

Bitmap bitmap2 = null; // declarare variabile

Bitmap topBitmap1 = null; // declarare variabile

try {

bitmap1 = BitmapFactory.decodeStream(getContentResolver()

.openInputStream(Uri.parse(img0))); // pentru a prelua date dintr-un URI de conținut

bitmap2 = BitmapFactory.decodeStream(getContentResolver()

.openInputStream(Uri.parse(img1))); // pentru a prelua date dintr-un URI de conținut

// se obține o cale din imaginea URI și se rotește cu metoda GetRotatedBitmap

bitmap1 = GetRotatedBitmap(getRealPathFromUri(getApplicationContext(), Uri.parse(img0)), this.imageSizeToShow);

bitmap2 = GetRotatedBitmap(getRealPathFromUri(getApplicationContext(), Uri.parse(img1)), this.imageSizeToShow);

//se creează un bitmap scalat

Bitmap.createScaledBitmap(bitmap1, 1920, 540, false);

Bitmap.createScaledBitmap(bitmap2, 1920, 540, false);

// se declară variabila locală, se obține lățimea de la bitmap

int width = bitmap1.getWidth();

// se declară variabila locală, se obține înălțimea de la bitmap

int height = bitmap2.getHeight() + bitmap1.getHeight();

// se creeză topBitmap1, Bitmap.Config.ARGB_8888 is a 32 bit format,each pixel is stored on 4 bytes

topBitmap1 = Bitmap.createBitmap(width, height,Bitmap.Config.ARGB_8888);

// se crează un nouCanvas

Canvas comboImage = new Canvas(topBitmap1);

// gata să atragă acel bitmap prin acea pânză

// se crează o matrice pentru manipulare

// matricea cu translație specificată

Matrix matrix = new Matrix();

matrix.preTranslate(-40, -5);

matrix.postTranslate(35,0);

matrix.postScale(1,1);

// gata să atragă acel bitmap prin acea pânză

comboImage.drawBitmap(bitmap1, matrix, null);

// matricea cu translație specificată

Matrix matrix1= new Matrix();

matrix1.preTranslate(0, 5);

matrix1.postTranslate(5, bitmap1.getHeight());

// matricea cu scara specificata

matrix1.postScale(1,1);

// gata să atragă acel bitmap prin acea pânză

comboImage.drawBitmap(bitmap2, matrix1, null);

} catch (FileNotFoundException e) {

e.printStackTrace();

}

return topBitmap1;

}

// Creează metoda GetRotatedBitmap și se obține un Bitmap din calea de la fișier

// filepath este un obiect care poate fi folosit pentru a localiza un fișier într-un sistem de fișiere

private Bitmap GetRotatedBitmap(String bitmap_filepath, int maxResolution) {

// se crează o matrice pentru manipulare

Matrix matrix = new Matrix();

try {

// se citește etichete Exif din fișierul imaginii specificate

// pentru orientarea imaginii

int orientation = new ExifInterface(bitmap_filepath)

.getAttributeInt("Orientation", 1);

if (orientation == 6) {

// se setează valoarea rotației imaginii la 90 de grade în matrice

matrix.postRotate(90.0f);

} else if (orientation == 3) {

// se setează valoarea rotației imaginii la 180 de grade în matrice

matrix.postRotate(180.0f);

} else if (orientation == 8) {

// se setează valoarea rotației imaginii la 270 de grade în matrice

matrix.postRotate(270.0f);

} else {

matrix.postRotate(0.0f);

}

} catch (Exception e) {

matrix.postRotate(0.0f);

}

Options bitOption = new Options();

// Options reprezintă o colecție de obiecte Option

bitOption.inSampleSize = getSampleSize(getBitmapMaxLength(bitmap_filepath), maxResolution);

// determina dimensiunea și lungimea imaginii

// mai întâi se decodifică imaginea pentru a verifica dimensiunile

Bitmap myBitmap = BitmapFactory.decodeFile(bitmap_filepath);

return Bitmap.createBitmap(myBitmap, 0, 0, myBitmap.getWidth(),

myBitmap.getHeight(), matrix, true);

}

//se crează metoda getSampleSize pentru a determina dimensiunea imaginii pentru a obține //dimensiunea eșantionului

private int getSampleSize(int desired_width, int image_width) {

// se calculează SampleSize

int SampleSize = 1; // Dimensiunea implicită a subsamblării

// dacă lățimea dorită este mai mică decât lățimea imaginii

if (desired_width < image_width) {

int i = 0;

while (i < 10) {

// returnează valoarea primului argument ridicat la puterea celui de-al doilea argument

//se calculează valoarea cea mai mare din SampleSize care are o putere de 2 și o lățime mai mare decât cea cerută și lățimea

if (((int) Math.pow(2.0d, (double) i)) * desired_width < image_width && ((int) Math.pow(2.0d, (double) (i + 1))) * desired_width >= image_width) {

SampleSize = (int) Math.pow(2.0d, (double) (i + 1));

i = 1000;

}

i++;

}

}

return SampleSize;

}

public static int getBitmapMaxLength(String fileName) {

try {

// se decodează inJustDecodeBounds=true pentru a verifica dimensiunile

Options options = new Options();

options.inJustDecodeBounds = true;

// se decodează pentru a verifica dimensiunile

BitmapFactory.decodeFile(fileName, options);

// înălțimea reală și lățimea imaginii

int h = options.outHeight;

int w = options.outWidth;

// alege cel mai mic raport în valoarea cu SampleSize, ceea ce va garanta

// o imagine finală cu ambele dimensiuni mai mari sau egale cu

// înălțime și lățime cerută

return h > w ? h : w;

} catch (Exception e) {

return 0;

}

}

//se convertește URI-ul imaginii în calea directă a sistemului de fișiere din fișierul imaginii

private String getRealPathFromUri(Context context, Uri uri) {

return FileUtils.getPath(context, uri);

}

private Bitmap ProcessingBitmap1() {

Bitmap bitmap1 = null; // declarare variabile

Bitmap bitmap2 = null; // declarare variabile

Bitmap newBitmap1 = null; // declarare variabile

try {

bitmap1 = BitmapFactory.decodeStream(getContentResolver()

.openInputStream(Uri.parse(img0)));

// pentru a prelua date dintr-un URI de conținut

bitmap2 = BitmapFactory.decodeStream(getContentResolver()

.openInputStream(Uri.parse(img1)));

// pentru a prelua date dintr-un URI de conținut

// se obține o cale din imaginea URI și se rotește cu metoda GetRotatedBitmap

bitmap1 = GetRotatedBitmap(getRealPathFromUri(getApplicationContext(), Uri.parse(img0)), this.imageSizeToShow);

bitmap2 = GetRotatedBitmap(getRealPathFromUri(getApplicationContext(), Uri.parse(img1)), this.imageSizeToShow);

int w; // se declară variabila locală, se obține lățimea de la bitmap

if (bitmap1.getWidth() >= bitmap2.getWidth()) {

w = bitmap1.getWidth();

} else {

w = bitmap2.getWidth();

}

int h;// se declară variabila locală, se obține înălțimea de la bitmap

if (bitmap1.getHeight() >= bitmap2.getHeight()) {

h = bitmap1.getHeight();

} else {

h = bitmap2.getHeight();

}

// create newBitmap1, Bitmap.Config.ARGB_8888 este un format de 32 de biți, fiecare pixel este stocat pe 4 octeți

newBitmap1 = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);

// se crează un nouCanvas

Canvas newCanvas = new Canvas(newBitmap1);

// gata să atragă acel bitmap prin acea pânză

// se crează o matrice pentru manipulare

Matrix matrix = new Matrix();

// matricea cu translație specificată

matrix.preTranslate(20, 5);

matrix.postTranslate(5, 0);

// matricea cu scara specificata

matrix.postScale(1,1);

newCanvas.drawBitmap(bitmap1, matrix, null);

//se crează un nou Paint cu setările implicite

Paint paint = new Paint();

paint.setAlpha(128);

// gata să atragă acel bitmap prin acea pânză

newCanvas.drawBitmap(bitmap2, 0, 0, paint);

} catch (FileNotFoundException e) {

e.printStackTrace();

}

return newBitmap1;

}

}

activity_confim.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:paddingBottom="@dimen/activity_vertical_margin"

android:paddingLeft="@dimen/activity_horizontal_margin"

android:paddingRight="@dimen/activity_horizontal_margin"

android:paddingTop="@dimen/activity_vertical_margin"

android:background="@drawable/background_3"

tools:context="com.example.d_app.Confirm" >

<ImageView

android:id="@+id/imageadjust"

android:layout_width="350dp"

android:layout_height="350dp"

android:layout_alignParentTop="true"

android:contentDescription="@string/none"

android:src="@drawable/ic_launcher" />

<Button

android:id="@+id/button_3"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_above="@+id/button_4"

android:layout_centerHorizontal="true"

android:layout_marginBottom="14dp"

android:text="@string/button_3"

android:background="@drawable/btn_4"

android:textSize="35sp"

android:textColor="#FFFFFF"

android:textStyle="bold"

android:minWidth="350dp"/>

<Button

android:id="@+id/button_4"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentBottom="true"

android:layout_centerHorizontal="true"

android:layout_marginBottom="16dp"

android:text="@string/button_4"

android:background="@drawable/btn_5"

android:textSize="35sp"

android:textColor="#FFFFFF"

android:textStyle="bold"

android:minWidth="250dp"/>

</RelativeLayout>

7.CV-ul autorului

Similar Posts