Files
SAE32_2025/docjava/fr/iutfbleau/sae/mpif/PIFReader.html
T
Diallo-VM-fbleau c24ad9fb2e mis a jour
2026-01-08 13:05:29 +01:00

492 lines
19 KiB
HTML

<!DOCTYPE HTML>
<!-- NewPage -->
<html lang="en">
<head>
<!-- Generated by javadoc (11.0.27) on Thu Jan 08 12:43:42 CET 2026 -->
<title>PIFReader</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="dc.created" content="2026-01-08">
<link rel="stylesheet" type="text/css" href="../../../../stylesheet.css" title="Style">
<link rel="stylesheet" type="text/css" href="../../../../jquery/jquery-ui.min.css" title="Style">
<link rel="stylesheet" type="text/css" href="../../../../jquery-ui.overrides.css" title="Style">
<script type="text/javascript" src="../../../../script.js"></script>
<script type="text/javascript" src="../../../../jquery/jszip/dist/jszip.min.js"></script>
<script type="text/javascript" src="../../../../jquery/jszip-utils/dist/jszip-utils.min.js"></script>
<!--[if IE]>
<script type="text/javascript" src="../../../../jquery/jszip-utils/dist/jszip-utils-ie.min.js"></script>
<![endif]-->
<script type="text/javascript" src="../../../../jquery/jquery-3.7.1.min.js"></script>
<script type="text/javascript" src="../../../../jquery/jquery-ui.min.js"></script>
</head>
<body>
<script type="text/javascript"><!--
try {
if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="PIFReader";
}
}
catch(err) {
}
//-->
var data = {"i0":10,"i1":10,"i2":10,"i3":9,"i4":10,"i5":10,"i6":10};
var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
var altColor = "altColor";
var rowColor = "rowColor";
var tableTab = "tableTab";
var activeTableTab = "activeTableTab";
var pathtoroot = "../../../../";
var useModuleDirectories = true;
loadScripts(document, 'script');</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
<header role="banner">
<nav role="navigation">
<div class="fixedNav">
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="topNav"><a id="navbar.top">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
<a id="navbar.top.firstrow">
<!-- -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../../../index.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../../../deprecated-list.html">Deprecated</a></li>
<li><a href="../../../../index-all.html">Index</a></li>
<li><a href="../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList" id="allclasses_navbar_top">
<li><a href="../../../../allclasses.html">All&nbsp;Classes</a></li>
</ul>
<ul class="navListSearch">
<li><label for="search">SEARCH:</label>
<input type="text" id="search" value="search" disabled="disabled">
<input type="reset" id="reset" value="reset" disabled="disabled">
</li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_top");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
</div>
<div>
<ul class="subNavList">
<li>Summary:&nbsp;</li>
<li>Nested&nbsp;|&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.summary">Method</a></li>
</ul>
<ul class="subNavList">
<li>Detail:&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.detail">Method</a></li>
</ul>
</div>
<a id="skip.navbar.top">
<!-- -->
</a></div>
<!-- ========= END OF TOP NAVBAR ========= -->
</div>
<div class="navPadding">&nbsp;</div>
<script type="text/javascript"><!--
$('.navPadding').css('padding-top', $('.fixedNav').css("height"));
//-->
</script>
</nav>
</header>
<!-- ======== START OF CLASS DATA ======== -->
<main role="main">
<div class="header">
<div class="subTitle"><span class="packageLabelInType">Package</span>&nbsp;<a href="package-summary.html">fr.iutfbleau.sae.mpif</a></div>
<h2 title="Class PIFReader" class="title">Class PIFReader</h2>
</div>
<div class="contentContainer">
<ul class="inheritance">
<li>java.lang.Object</li>
<li>
<ul class="inheritance">
<li>fr.iutfbleau.sae.mpif.PIFReader</li>
</ul>
</li>
</ul>
<div class="description">
<ul class="blockList">
<li class="blockList">
<hr>
<pre>public class <span class="typeNameLabel">PIFReader</span>
extends java.lang.Object</pre>
<div class="block">Cette classe permet de lire un fichier .pif et de reconstruire l'image d'origine.
Elle lit d'abord l'en-tête puis les longueurs des codes canoniques.
Ensuite elle reconstruit les codes, construit les arbres de décodage
et décode les pixels un par un pour obtenir l'image RGB finale.
Elle est utilisée par le programme Viewer pour afficher une image .pif.</div>
</li>
</ul>
</div>
<div class="summary">
<ul class="blockList">
<li class="blockList">
<!-- ======== CONSTRUCTOR SUMMARY ======== -->
<section>
<ul class="blockList">
<li class="blockList"><a id="constructor.summary">
<!-- -->
</a>
<h3>Constructor Summary</h3>
<table class="memberSummary">
<caption><span>Constructors</span><span class="tabEnd">&nbsp;</span></caption>
<tr>
<th class="colFirst" scope="col">Constructor</th>
<th class="colLast" scope="col">Description</th>
</tr>
<tr class="altColor">
<th class="colConstructorName" scope="row"><code><span class="memberNameLink"><a href="#%3Cinit%3E()">PIFReader</a></span>()</code></th>
<td class="colLast">&nbsp;</td>
</tr>
</table>
</li>
</ul>
</section>
<!-- ========== METHOD SUMMARY =========== -->
<section>
<ul class="blockList">
<li class="blockList"><a id="method.summary">
<!-- -->
</a>
<h3>Method Summary</h3>
<table class="memberSummary">
<caption><span id="t0" class="activeTableTab"><span>All Methods</span><span class="tabEnd">&nbsp;</span></span><span id="t1" class="tableTab"><span><a href="javascript:show(1);">Static Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t4" class="tableTab"><span><a href="javascript:show(8);">Concrete Methods</a></span><span class="tabEnd">&nbsp;</span></span></caption>
<tr>
<th class="colFirst" scope="col">Modifier and Type</th>
<th class="colSecond" scope="col">Method</th>
<th class="colLast" scope="col">Description</th>
</tr>
<tr id="i0" class="altColor">
<td class="colFirst"><code><a href="DecodeNode.html" title="class in fr.iutfbleau.sae.mpif">DecodeNode</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#buildDecodageTree(java.util.Map)">buildDecodageTree</a></span>&#8203;(java.util.Map&lt;java.lang.String,&#8203;java.lang.Integer&gt;&nbsp;codes)</code></th>
<td class="colLast">
<div class="block">Construit un arbre de décodage à partir des codes canoniques.</div>
</td>
</tr>
<tr id="i1" class="rowColor">
<td class="colFirst"><code><a href="RGBImage.html" title="class in fr.iutfbleau.sae.mpif">RGBImage</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#decodePifFile(java.io.File)">decodePifFile</a></span>&#8203;(java.io.File&nbsp;file)</code></th>
<td class="colLast">
<div class="block">Cette methode sert de point d'entrer pour le decodage d'un pif.</div>
</td>
</tr>
<tr id="i2" class="altColor">
<td class="colFirst"><code><a href="RGBImage.html" title="class in fr.iutfbleau.sae.mpif">RGBImage</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#decodePixels(fr.iutfbleau.sae.mpif.BitInputStream,fr.iutfbleau.sae.mpif.DecodeNode,fr.iutfbleau.sae.mpif.DecodeNode,fr.iutfbleau.sae.mpif.DecodeNode)">decodePixels</a></span>&#8203;(<a href="BitInputStream.html" title="class in fr.iutfbleau.sae.mpif">BitInputStream</a>&nbsp;in,
<a href="DecodeNode.html" title="class in fr.iutfbleau.sae.mpif">DecodeNode</a>&nbsp;red,
<a href="DecodeNode.html" title="class in fr.iutfbleau.sae.mpif">DecodeNode</a>&nbsp;green,
<a href="DecodeNode.html" title="class in fr.iutfbleau.sae.mpif">DecodeNode</a>&nbsp;blue)</code></th>
<td class="colLast">
<div class="block">Décode l'ensemble des pixels de l'image en utilisant les trois arbres
correspondant aux composantes rouge, verte et bleue.</div>
</td>
</tr>
<tr id="i3" class="rowColor">
<td class="colFirst"><code>static boolean</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#isPIFFile(java.io.File)">isPIFFile</a></span>&#8203;(java.io.File&nbsp;f)</code></th>
<td class="colLast">
<div class="block">Vérifie si un fichier est un fichier .pif valide.</div>
</td>
</tr>
<tr id="i4" class="altColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#readCanonicalTables(fr.iutfbleau.sae.mpif.BitInputStream)">readCanonicalTables</a></span>&#8203;(<a href="BitInputStream.html" title="class in fr.iutfbleau.sae.mpif">BitInputStream</a>&nbsp;in)</code></th>
<td class="colLast">
<div class="block">Lit les longueurs des code canoniques pour les trois composantes
rouge, vert et bleu.</div>
</td>
</tr>
<tr id="i5" class="rowColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#readHeader(fr.iutfbleau.sae.mpif.BitInputStream)">readHeader</a></span>&#8203;(<a href="BitInputStream.html" title="class in fr.iutfbleau.sae.mpif">BitInputStream</a>&nbsp;in)</code></th>
<td class="colLast">
<div class="block">Lit l'en-tête du fichier .pif.</div>
</td>
</tr>
<tr id="i6" class="altColor">
<td class="colFirst"><code>java.util.Map&lt;java.lang.String,&#8203;java.lang.Integer&gt;</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#rebuildCanonical(int%5B%5D)">rebuildCanonical</a></span>&#8203;(int[]&nbsp;lengths)</code></th>
<td class="colLast">
<div class="block">Reconstruit les codes canoniques à partir des longueurs stockées dans le fichier.</div>
</td>
</tr>
</table>
<ul class="blockList">
<li class="blockList"><a id="methods.inherited.from.class.java.lang.Object">
<!-- -->
</a>
<h3>Methods inherited from class&nbsp;java.lang.Object</h3>
<code>clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait</code></li>
</ul>
</li>
</ul>
</section>
</li>
</ul>
</div>
<div class="details">
<ul class="blockList">
<li class="blockList">
<!-- ========= CONSTRUCTOR DETAIL ======== -->
<section>
<ul class="blockList">
<li class="blockList"><a id="constructor.detail">
<!-- -->
</a>
<h3>Constructor Detail</h3>
<a id="&lt;init&gt;()">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>PIFReader</h4>
<pre>public&nbsp;PIFReader()</pre>
</li>
</ul>
</li>
</ul>
</section>
<!-- ============ METHOD DETAIL ========== -->
<section>
<ul class="blockList">
<li class="blockList"><a id="method.detail">
<!-- -->
</a>
<h3>Method Detail</h3>
<a id="decodePifFile(java.io.File)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>decodePifFile</h4>
<pre class="methodSignature">public&nbsp;<a href="RGBImage.html" title="class in fr.iutfbleau.sae.mpif">RGBImage</a>&nbsp;decodePifFile&#8203;(java.io.File&nbsp;file)
throws java.lang.Exception</pre>
<div class="block">Cette methode sert de point d'entrer pour le decodage d'un pif.
Elle Lit complètement un fichier .pif et renvoie l'image décodée.
Elle lit l'en-tête, récupère les longueurs des codes,
reconstruit les codes canoniques puis les arbres nécessaires
au décodage. Enfin elle lit pixel par pixel.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>file</code> - fichier .pif à décoder</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>l'image obtenue après décodage</dd>
<dt><span class="throwsLabel">Throws:</span></dt>
<dd><code>java.lang.Exception</code> - si le fichier est invalide ou si une erreur survient pendant la lecture</dd>
</dl>
</li>
</ul>
<a id="readHeader(fr.iutfbleau.sae.mpif.BitInputStream)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>readHeader</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;readHeader&#8203;(<a href="BitInputStream.html" title="class in fr.iutfbleau.sae.mpif">BitInputStream</a>&nbsp;in)
throws java.io.IOException</pre>
<div class="block">Lit l'en-tête du fichier .pif. On y récupère la largeur
et la hauteur de l'image, chacune codée sur 16 bits.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>in</code> - flux binaire à lire</dd>
<dt><span class="throwsLabel">Throws:</span></dt>
<dd><code>java.io.IOException</code> - si la lecture échoue</dd>
</dl>
</li>
</ul>
<a id="readCanonicalTables(fr.iutfbleau.sae.mpif.BitInputStream)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>readCanonicalTables</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;readCanonicalTables&#8203;(<a href="BitInputStream.html" title="class in fr.iutfbleau.sae.mpif">BitInputStream</a>&nbsp;in)
throws java.io.IOException</pre>
<div class="block">Lit les longueurs des code canoniques pour les trois composantes
rouge, vert et bleu. Chaque table contient 256 valeurs sur 5 bits.
Ces longueurs permettront de reconstruire les vrais codes plus tard</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>in</code> - flux binaire d'entrée pdfpdof</dd>
<dt><span class="throwsLabel">Throws:</span></dt>
<dd><code>java.io.IOException</code> - si erreur de lecture se produit</dd>
</dl>
</li>
</ul>
<a id="rebuildCanonical(int[])">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>rebuildCanonical</h4>
<pre class="methodSignature">public&nbsp;java.util.Map&lt;java.lang.String,&#8203;java.lang.Integer&gt;&nbsp;rebuildCanonical&#8203;(int[]&nbsp;lengths)</pre>
<div class="block">Reconstruit les codes canoniques à partir des longueurs stockées dans le fichier.
On trie d'abord les paires (symbole, longueur), puis on génère les codes
en appliquant la règle des codes canoniques.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>lengths</code> - tableau contenant les longueurs des codes pour 256 symboles</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>une table qui associe un code binaire (sous forme de texte) à son symbole</dd>
</dl>
</li>
</ul>
<a id="buildDecodageTree(java.util.Map)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>buildDecodageTree</h4>
<pre class="methodSignature">public&nbsp;<a href="DecodeNode.html" title="class in fr.iutfbleau.sae.mpif">DecodeNode</a>&nbsp;buildDecodageTree&#8203;(java.util.Map&lt;java.lang.String,&#8203;java.lang.Integer&gt;&nbsp;codes)</pre>
<div class="block">Construit un arbre de décodage à partir des codes canoniques.
Chaque code binaire définit un chemin dans l'arbre jusqu'à une feuille
contenant le symbole à décoder.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>codes</code> - dictionnaire associant le code binaire au symbole</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>la racine de l'arbre de décodage</dd>
</dl>
</li>
</ul>
<a id="decodePixels(fr.iutfbleau.sae.mpif.BitInputStream,fr.iutfbleau.sae.mpif.DecodeNode,fr.iutfbleau.sae.mpif.DecodeNode,fr.iutfbleau.sae.mpif.DecodeNode)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>decodePixels</h4>
<pre class="methodSignature">public&nbsp;<a href="RGBImage.html" title="class in fr.iutfbleau.sae.mpif">RGBImage</a>&nbsp;decodePixels&#8203;(<a href="BitInputStream.html" title="class in fr.iutfbleau.sae.mpif">BitInputStream</a>&nbsp;in,
<a href="DecodeNode.html" title="class in fr.iutfbleau.sae.mpif">DecodeNode</a>&nbsp;red,
<a href="DecodeNode.html" title="class in fr.iutfbleau.sae.mpif">DecodeNode</a>&nbsp;green,
<a href="DecodeNode.html" title="class in fr.iutfbleau.sae.mpif">DecodeNode</a>&nbsp;blue)
throws java.io.IOException</pre>
<div class="block">Décode l'ensemble des pixels de l'image en utilisant les trois arbres
correspondant aux composantes rouge, verte et bleue.
Chaque symbole est lu en parcourant l'arbre bit par bit.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>in</code> - flux binaire contenant les données des pixels</dd>
<dd><code>red</code> - arbre de décodage pour le rouge</dd>
<dd><code>green</code> - arbre pour le vert</dd>
<dd><code>blue</code> - arbre pour le bleu</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>l'image RGB reconstruite</dd>
<dt><span class="throwsLabel">Throws:</span></dt>
<dd><code>java.io.IOException</code> - si un symbole est invalide ou si la lecture échoue</dd>
</dl>
</li>
</ul>
<a id="isPIFFile(java.io.File)">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>isPIFFile</h4>
<pre class="methodSignature">public static&nbsp;boolean&nbsp;isPIFFile&#8203;(java.io.File&nbsp;f)</pre>
<div class="block">Vérifie si un fichier est un fichier .pif valide.
On teste l'existence du fichier, son extension et une taille minimale
permettant au moins de contenir l'en-tête et les tables de longueurs.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>f</code> - fichier à tester</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>true si le fichier semble être un .pif valide, sinon false</dd>
</dl>
</li>
</ul>
</li>
</ul>
</section>
</li>
</ul>
</div>
</div>
</main>
<!-- ========= END OF CLASS DATA ========= -->
<footer role="contentinfo">
<nav role="navigation">
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<div class="bottomNav"><a id="navbar.bottom">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
<a id="navbar.bottom.firstrow">
<!-- -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../../../index.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../../../deprecated-list.html">Deprecated</a></li>
<li><a href="../../../../index-all.html">Index</a></li>
<li><a href="../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList" id="allclasses_navbar_bottom">
<li><a href="../../../../allclasses.html">All&nbsp;Classes</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_bottom");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
</div>
<div>
<ul class="subNavList">
<li>Summary:&nbsp;</li>
<li>Nested&nbsp;|&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.summary">Method</a></li>
</ul>
<ul class="subNavList">
<li>Detail:&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.detail">Method</a></li>
</ul>
</div>
<a id="skip.navbar.bottom">
<!-- -->
</a></div>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
</nav>
</footer>
</body>
</html>