» »

JAVA neujemanje tipov

JAVA neujemanje tipov

l0g1t3ch ::

imam tole metodo

public Image loadImage(String path)
{
BufferedImage tmp = null;
try
{
tmp = ImageIO.read(new File(path));
}
catch (IOException e)
{
System.err.println("Napaka pri branju slike");
}
return tmp;
}

in jo takole kličem

BufferedImage img = null;
img = loadImage("c:\\test.jpg");

pa zadeva ne dela, če pa dam tkole

img = (BufferedImage)loadImage("c:\\test.jpg");

pa dela normalno
Zanima me zakaj morm tm castat v BufferedImage če pa tak tip že vračam. Se mi zdi d ga Java mal serje
  • spremenilo: l0g1t3ch ()

Sergio ::

ImageIO.read() vraca objekt tipa Image, in ne objekta tipa BufferedImage. Ker ves da bos uporabljal BufferedImage, je potreben se eksplicitni type cast.
Tako grem jaz, tako gre vsak, kdor čuti cilj v daljavi:
če usoda ustavi mu korak,
on se ji zoperstavi.

l0g1t3ch ::

Samo zakaj saj itak rezultat metode že priredim prej neki spremenljivki, ki je BufferedImage in pol to vrnem

overlord_tm ::

public Image loadImage(String path)

daj tole v public BufferedImage loadImage(String path)

Tam v glavi metode je določen kak tip vračaš. Meni je zanimivo že to da v metodi ki vrne Image dovoli v return stavek dat BufferedImage

l0g1t3ch ::

sm opazu kako neumnost sm naredu

A je kdo drugace kaj delu z pixelGraber razredom iz Jave. Meni nikakor ne uspe dobiti tabele pixlov iz slike še manj pa zapisati to potem nazaj v sliko. Če kdo zna bi prosu za pomoč

l0g1t3ch ::

moja koda, ki enostavno naloži neko sliko in jo prikaže. Zanima me pa zakaj ne dela metoda getPixels. Sej neki naredi amapk v polje kamor shrani so vse vrednosti nekam čudne. Povečino so -1 ponekod pa drugo negativno število.


/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package org2;

import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.PixelGrabber;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class Main
{

/**
* @param args the command line arguments
*/
public static void main(String[] args)
{
ImgProc frame = new ImgProc();
}

}


class ImgProc extends JFrame
{
BufferedImage img = null;
int[] Pixels = null;

public ImgProc()
{
setSize( 1000, 1000 );
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBackground(Color.white);
setTitle( "Image Processing" );
img = getImage("C:\\test.bmp");
getPixels(img);
setVisible(true);
}

public void getPixels( BufferedImage img )
{
PixelGrabber pg = new PixelGrabber(img, 0, 0,100, 100, false);
Pixels = new int[ pg.getWidth() * pg.getHeight() ];
try
{
pg.grabPixels();
}
catch (Exception e)
{
System.err.println("napaka v PixelGrabber-ju");
}
Pixels = (int[])pg.getPixels();


}


public BufferedImage getImage(String path)
{
BufferedImage tmp = null;
try
{
tmp = ImageIO.read(new File(path));
}
catch (IOException ioe)
{
System.err.println("Ne morem prebrati slike");
}
return tmp;
}


public void paint( Graphics g )
{
g.drawImage(img, 0, 0, null);
}
}





morbo ::

public Object getPixels()

"Get the pixel buffer. If the PixelGrabber was not constructed with an explicit pixel buffer to hold the pixels then this method will return null until the size and format of the image data is known."

Torej PixelGrabber ustvari s konstruktorjem ki ti omogoča da podaš svoj buffer.

Meni je zanimivo že to da v metodi ki vrne Image dovoli v return stavek dat BufferedImage

BufferedImage posreduje vse metode razreda Image, torej je takšen pristop povsem varen (in predvsem uporaben za generiko).

l0g1t3ch ::

Ne glede kaj probavam zmeri dobim vsaj zame kar ene vrednosti. Pol sm pa za foro poskusu to zapisat v eno sliko na disk in dejansko dobim samo nek zmazek. Če ima kdo kako delujočo kodo lepo prosim za primer kako se naredi.

morbo ::

Mogoče slika še ni popolnoma naložena takrat ko uporabiš paint()? Probaj uporabit java.awt.MediaTracker

Kaj točno pa sploh delaš s temi piksli? Namesto PixelGrabberja lahko uporabiš Raster in iz njega dobiš buffer pikslov. Tako:

int[] pixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData();
potem s poljem nekaj narediš, in ga zapišeš nazaj z:
image.getRaster().setDataElements(0, 0, w, h, pixels);
kjer sta w in h širina in višina slike

l0g1t3ch ::

Rabim za obdelavo slik z raznimi filtri. Sej vem d ma java to že vgrajene te filtre sam mormo nardit sami. Pa mi filtri sami ne delajo nobenga problema samo zajem slike pa :D
Filtri so pa glajenje, ostrenje, iskanje robov in tko naprej

morbo ::

Če si še nisi, si poglej tole

l0g1t3ch ::

Sm si pogledu java2D pa ni tm nic uporabnega oz nicesar kar se tice grebanja pixlov.
Sm pa probu tudi tvojo drugo kodo in isto ne dela :(
Pocasi bom popizdu ;(. Bistvo naloge, tiste filtrem sm naredu 1,2,3. Zajem slike ko naj bi bil rutinski mi pa v 3h dneh ni ratal

morbo ::

Kako veš da si filtre naredil, če ti ni uspelo 'zajeti slike'?

Tole 100% dela:

BufferedImage img = new BufferedImage(4, 4, BufferedImage.TYPE_INT_ARGB);

// shrani raster v polje
int[] pixels = ((DataBufferInt) img.getRaster().getDataBuffer()).getData();

// zgornjemu levemu pikslu nastavi barvo na polprosojno rdeco (vsak int v polju je en
// piksel predstavljen z osmimi biti za vsak kanal ARGB)
pixels[0] = (128 << 24) | (255 << 16) | (0 << 8) | (0 << 0);

// prepise raster z novimi podatki
img.getRaster().setDataElements(0, 0, 4, 4, pixels);

// zapise sliko na disk
ImageIO.write(img, "png", new File("/home/user/test.png"));

Zgodovina sprememb…

  • spremenil: morbo ()

l0g1t3ch ::

Naredu sm tkole :d
S pythonom sm prebral sliko jo zapisu v matriko, to matriko hranu v txt fajl pa ga v javi prebral in spet dobu matriko ki sm jo nucu :d

l0g1t3ch ::

Zakaj je v teli vrstici treba indeksa dati kot (j, i) in ne kot (i,j) kot bi človek pričakoval
pixel = image.getRGB(j, i) ;

Se pravi ne pobiramo pixlov (0,0) (0,1) (0,2) in tako naprej ampak (0,0) (1,0) (2,0)

 koda

koda



P.S. dodajanje kode v topic je ZANEČ !

Zgodovina sprememb…

  • spremenilo: l0g1t3ch ()

l0g1t3ch ::

Sm pogruntu kaj je blo narobe, oz. ni blo nc narobe sam mene je pozna ura mal dajala


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

kako narediti program ki bere drugi program

Oddelek: Programiranje
465734 (4047) imagodei
»

[Netbeans-Java]Embossing,blurring,sharpening

Oddelek: Programiranje
71133 (1035) t3hn0
»

[Java] pošiljanje slik prek porta

Oddelek: Programiranje
51198 (1117) xlarge
»

[java] branje TGA

Oddelek: Programiranje
81408 (1279) kopernik
»

[java] transparentnost

Oddelek: Programiranje
91223 (997) jpzoky1

Več podobnih tem