Advertisement
Guest User

Untitled

a guest
Dec 10th, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.13 KB | None | 0 0
  1. /**
  2. * SWBild ist eine Klasse, die Graustufenbilder repraesentiert und
  3. * manipuliert. Die Implementierung erfolgt durch ein einfaches
  4. * Bildformat: Die Bildpunkte werden in einem zweidimensionalen
  5. * Array von 'short'-Werten gehalten. Short ist eine Datentyp für
  6. * ganzzahlige Werte, wie int. Aber Short kann weniger Werte darstellen.
  7. * Jeder Feldeintrag in einem SWBild kann einen Wert zwischen 0 und 255
  8. * annehmen. Andere Werte sind unzulaessig.
  9. * Der Wertebereich [0..255] repraesentiert den Graustufenbereich:
  10. * 0 fuer Schwarz, 255 fuer Weiss und dazwischenliegende Werte fuer
  11. * die Grauabstufungen.
  12. *
  13. * Beispielmethode 'dunkler': Ein geladenes Bild kann um
  14. * ein gegebenes 'delta' abgedunkelt werden.
  15. *
  16. * @author Axel Schmolitzky, Petra Becker-Pechau
  17. * @version 11/2018
  18. */
  19. class SWBild
  20. {
  21.  
  22. // die Bilddaten dieses Bildes, ein Array von Bildpunkten
  23. private short[][] _bilddaten;
  24.  
  25. // die Breite dieses Bildes
  26. private int _breite;
  27.  
  28. // die Hoehe dieses Bildes
  29. private int _hoehe;
  30.  
  31. // Leinwand zur Anzeige
  32. private Leinwand _leinwand;
  33.  
  34. /**
  35. * Initialisiert ein Bild mit einer Bilddatei. Der Benutzer kann interaktiv mit
  36. * Hilfe eines Dateidialogs die zu ladende Datei auswaehlen.
  37. */
  38. public SWBild()
  39. {
  40. _bilddaten = BildEinleser.liesBilddaten();
  41. if (_bilddaten != null)
  42. {
  43. aktualisiereBildgroesse(_bilddaten);
  44. erzeugeLeinwand();
  45. }
  46. }
  47.  
  48. /**
  49. * Initialisiert ein Bild mit einer Bilddatei. Der Dateiname kann als absoluter
  50. * oder relativer Pfad uebergeben werden.
  51. *
  52. * @param bilddateiName
  53. * der Name der Bilddatei
  54. */
  55. public SWBild(String bilddateiName)
  56. {
  57. _bilddaten = BildEinleser.liesBilddaten(bilddateiName);
  58. aktualisiereBildgroesse(_bilddaten);
  59. erzeugeLeinwand();
  60. }
  61.  
  62. /**
  63. * Dieses Bild um einen Wert abdunkeln.
  64. *
  65. * @param delta
  66. * Wert der Abdunkelung. Es wird mit dem Betrag von delta gerechnet,
  67. * deshalb darf der Parameter sowohl positiv als auch negativ sein.
  68. */
  69. public void dunkler(int delta)
  70. {
  71. if (delta < 0)
  72. {
  73. delta = -delta;
  74. }
  75.  
  76. // Durch alle Bildpunkte gehen und jeden Wert um das Delta verringern:
  77. for (int y = 0; y < _hoehe; y++)
  78. {
  79. for (int x = 0; x < _breite; x++)
  80. {
  81. punktAbdunkeln(y, x, delta);
  82. }
  83. }
  84. // Neuzeichnen der Bildleinwand, basierend auf den Werten in _bilddaten:
  85. zeichneBild();
  86. }
  87.  
  88. public void heller(int delta)
  89. {
  90. if (delta < 0)
  91. {
  92. delta = -delta;
  93. }
  94.  
  95. // Durch alle Bildpunkte gehen und jeden Wert um das Delta verringern:
  96. for (int y = 0; y < _hoehe; y++)
  97. {
  98. for (int x = 0; x < _breite; x++)
  99. {
  100. punktAufhellen(y, x, delta);
  101. }
  102. }
  103. // Neuzeichnen der Bildleinwand, basierend auf den Werten in _bilddaten:
  104. zeichneBild();
  105. }
  106.  
  107. /**
  108. * Den gegebenen Punkt abdunkeln um den in delta übergebenen Wert.
  109. * Beim Abdunkeln wird der Wert des Bildpunkts reduziert.
  110. * Der Parameter delta muss ein positiver Wert sein.
  111. */
  112. private void punktAbdunkeln(int y, int x, int delta)
  113. {
  114. if ((_bilddaten[y][x] - delta) > 0) // Wert darf 0 nicht unterschreiten
  115. {
  116. _bilddaten[y][x] = (short) (_bilddaten[y][x] - delta);
  117. }
  118. else
  119. {
  120. _bilddaten[y][x] = 0;
  121. }
  122. }
  123.  
  124. private void punktAufhellen(int y, int x, int delta)
  125. {
  126. if ((_bilddaten[y][x] + delta) < 255) // Wert darf 0 nicht unterschreiten
  127. {
  128. _bilddaten[y][x] = (short) (_bilddaten[y][x] + delta);
  129. }
  130. else
  131. {
  132. _bilddaten[y][x] = 255;
  133. }
  134. }
  135.  
  136. /**
  137. * Dieses Bild invertieren.
  138. */
  139. public void invertieren()
  140. {
  141. // Durch alle Bildpunkte des Bildes gehen und jeden Wert "invertieren"
  142. for (int y = 0; y < _hoehe; y++)
  143. {
  144. for (int x = 0; x < _breite; x++)
  145. {
  146. _bilddaten[y][x] = (short) (255 - _bilddaten[y][x]);
  147. }
  148. }
  149. zeichneBild();
  150. }
  151.  
  152. /**
  153. * Dieses Bild horizontal spiegeln.
  154. */
  155. public void horizontalSpiegeln()
  156. {
  157. for (int y = 0; y < _hoehe/2; y++)
  158. {
  159. for (int x = 0; x < _breite; x++)
  160. {
  161. // _bilddaten[y][x] = _bilddaten[_hoehe - 1 - y] [x];
  162. short tmp =_bilddaten[_hoehe - 1 - y] [x];
  163. _bilddaten[_hoehe - 1 - y][x] = _bilddaten[y] [x];
  164. _bilddaten[y][x] = tmp;
  165. }
  166. }
  167. zeichneBild();
  168. }
  169.  
  170. /**
  171. * Dieses Bild weichzeichnen.
  172. */
  173. public void weichzeichnen()
  174. {
  175. // HIER FEHLT NOCH WAS
  176. }
  177.  
  178. /**
  179. * Dieses Bild am Mittelpunkt spiegeln.
  180. */
  181. public void punktpiegeln()
  182. {
  183. // HIER FEHLT NOCH WAS
  184. }
  185.  
  186. /**
  187. * Erzeugt bei diesem Bild einen Spot mit Radius r, Mittelpunkt x0,y0 und
  188. * Beleuchtungsintensitaet i.
  189. *
  190. * Das bedeutet, dass alles innerhalb eines Kreises mit dem Mittelwpunkt x0,y0
  191. * und dem Radius r alle Bildpunkte um den Wert i aufgehellt werden sollen.
  192. *
  193. * Freiwillige Zusatzaufgabe: Ausserhalb von r nimmt die Ausleuchtung linear ab.
  194. * Wie im wirklichen Leben...
  195. *
  196. * @param xo
  197. * x-Koordinate des Mittelpunktes
  198. * @param yo
  199. * y-Koordinate des Mittelpunktes
  200. * @param r
  201. * Radius
  202. * @param i
  203. * Beleuchtungsintesitaet
  204. */
  205. public void spot(int x0, int y0, int r, short i)
  206. {
  207. // HIER FEHLT NOCH WAS
  208. }
  209.  
  210. /**
  211. * Gib den Wert eines einzelnen Bildpunktes zurueck.
  212. *
  213. * @param y
  214. * die y-Koordinate des Bildpunktes.
  215. * @param x
  216. * die x-Koordinate des Bildpunktes.
  217. * @return den Wert des angegebenen Bildpunktes.
  218. */
  219. public short gibBildpunkt(int y, int x)
  220. {
  221. return _bilddaten[y][x];
  222. }
  223.  
  224. // ==== private Hilfsmethoden ====
  225.  
  226. /**
  227. * Zeichnet das Bild in _bilddaten neu
  228. */
  229. private void zeichneBild()
  230. {
  231. _leinwand.sichtbarMachen();
  232. _leinwand.zeichneBild(_bilddaten);
  233. }
  234.  
  235. /**
  236. * Hoehe und Breite neu berechnen, nachdem die Bilddaten veraendert worden sind.
  237. */
  238. private void aktualisiereBildgroesse(short[][] bilddaten)
  239. {
  240. _hoehe = bilddaten.length;
  241. if (_hoehe == 0)
  242. {
  243. _breite = 0;
  244. }
  245. else
  246. {
  247. _breite = bilddaten[0].length;
  248. }
  249. }
  250.  
  251. /**
  252. * Erzeuge die Leinwand zur Darstellung und zeige sie an.
  253. */
  254. private void erzeugeLeinwand()
  255. {
  256. _leinwand = new Leinwand("Bildbetrachter", _breite, _hoehe);
  257.  
  258. zeichneBild();
  259. }
  260. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement