/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
skalering af billeder
Fra : Thomas Bendsen


Dato : 18-10-04 18:21

Hej

Jeg har skrevet et program som står for behandling af mine digitale
fotos, dvs. skalering/rotation og efterfølgende upload til min
hjemmeside. Nu har jeg imidlertid købt et nyt kamera som tager billeder
med en opløsning på over 3000x2000 pixels. Når disse skaleres til
640x480 bliver resultatet mildt sagt ikke særligt pænt (meget pixeleret).

Lige nu benytter jeg blot en AffineTransformOp hvor transformationen
selvfølgelig blot en almindelig skalering.

Er der nogen som kan hjælpe med en algoritme til at foretage en pænere
skalering, eller som kan henvise til et godt sted at læse mere om emnet.
Der er tale om JPEG-billeder.

MVH Thomas

--
MVH
Thomas Bendsen

 
 
stig (18-10-2004)
Kommentar
Fra : stig


Dato : 18-10-04 19:38

Jeg bruger jai (java advanced imaging) og en statisk metode som denne:

public static void scaleImage(File imageFile, File scaledFile) {

ParameterBlockJAI pb;

RenderedOp imgOp;

pb = new ParameterBlockJAI("fileload");

pb.setParameter("filename", imageFile.getAbsolutePath());

imgOp = JAI.create("fileload", pb);

pb = new ParameterBlockJAI("scale");

pb.addSource(imgOp);

pb.setParameter("xScale", 0.2f); // x scale factor

pb.setParameter("yScale", 0.2f); // y scale factor

pb.setParameter("xTrans", 0f); // x translate

pb.setParameter("yTrans", 0f); // y translate

imgOp = JAI.create("scale", pb);

pb = new ParameterBlockJAI("filestore");

pb.addSource(imgOp);

pb.setParameter("filename", scaledFile.getAbsolutePath());

if (scaledFile.getName().endsWith(".jpg")

|| scaledFile.getName().endsWith(".jpeg"))

pb.setParameter("format", "jpeg");

JAI.create("filestore", pb);

}



Stig


"Thomas Bendsen" <thomas_bendsen@stofanet.dk> wrote in message
news:thomas_bendsen-A675C9.19210318102004@nntp02.dk.telia.net...
> Hej
>
> Jeg har skrevet et program som står for behandling af mine digitale
> fotos, dvs. skalering/rotation og efterfølgende upload til min
> hjemmeside. Nu har jeg imidlertid købt et nyt kamera som tager billeder
> med en opløsning på over 3000x2000 pixels. Når disse skaleres til
> 640x480 bliver resultatet mildt sagt ikke særligt pænt (meget pixeleret).
>
> Lige nu benytter jeg blot en AffineTransformOp hvor transformationen
> selvfølgelig blot en almindelig skalering.
>
> Er der nogen som kan hjælpe med en algoritme til at foretage en pænere
> skalering, eller som kan henvise til et godt sted at læse mere om emnet.
> Der er tale om JPEG-billeder.
>
> MVH Thomas
>
> --
> MVH
> Thomas Bendsen



Thomas Bendsen (18-10-2004)
Kommentar
Fra : Thomas Bendsen


Dato : 18-10-04 20:03

In article <41740c68$0$13741$ba624c82@nntp03.dk.telia.net>,
"stig" <stigth@stofanet.dk> wrote:

> Jeg bruger jai (java advanced imaging) og en statisk metode som denne:
>
> public static void scaleImage(File imageFile, File scaledFile) {
>
> ParameterBlockJAI pb;
>
> RenderedOp imgOp;
>
> pb = new ParameterBlockJAI("fileload");
>
> pb.setParameter("filename", imageFile.getAbsolutePath());
>
> imgOp = JAI.create("fileload", pb);
>
> pb = new ParameterBlockJAI("scale");
>
> pb.addSource(imgOp);
>
> pb.setParameter("xScale", 0.2f); // x scale factor
>
> pb.setParameter("yScale", 0.2f); // y scale factor
>
> pb.setParameter("xTrans", 0f); // x translate
>
> pb.setParameter("yTrans", 0f); // y translate
>
> imgOp = JAI.create("scale", pb);
>
> pb = new ParameterBlockJAI("filestore");
>
> pb.addSource(imgOp);
>
> pb.setParameter("filename", scaledFile.getAbsolutePath());
>
> if (scaledFile.getName().endsWith(".jpg")
>
> || scaledFile.getName().endsWith(".jpeg"))
>
> pb.setParameter("format", "jpeg");
>
> JAI.create("filestore", pb);
>
> }
>
>
>
> Stig
>

Hej Stig

Det ser interessant ud. Jeg har ikke tidligere brugt JAI så jeg skal
lige have lidt tid til at forstå koden, men jeg skal nok vende tilbage
med en melding om det kan bruges.

--
MVH
Thomas Bendsen

Thomas Bendsen (20-10-2004)
Kommentar
Fra : Thomas Bendsen


Dato : 20-10-04 18:22

In article <41740c68$0$13741$ba624c82@nntp03.dk.telia.net>,
"stig" <stigth@stofanet.dk> wrote:

> Jeg bruger jai (java advanced imaging) og en statisk metode som denne:
>
> public static void scaleImage(File imageFile, File scaledFile) {
>
>
> Stig
>

Hej Stig

Jeg har nu prøvet din metode, og den giver stort set samme resultat som
min egen metode. Dvs at ved kraftig nedskalering bliver resultatet ikke
særligt pænt.

Til gengæld har jeg muligvis fundet en anden metode, som jeg dog endnu
ikke har implementeret i java. Start med at køre et blurfilter hen over
billedet, og skaler herefter. Så bliver resultatet væsentligt mere jævnt.

--
MVH
Thomas Bendsen

Jonas Pedersen (22-10-2004)
Kommentar
Fra : Jonas Pedersen


Dato : 22-10-04 23:41

Thomas Bendsen wrote:
>
> Er der nogen som kan hjælpe med en algoritme til at foretage en pænere
> skalering, eller som kan henvise til et godt sted at læse mere om emnet.
> Der er tale om JPEG-billeder.
>

Hej

Jeg har selv samme problem og tror snart jeg har været hele nettet
igennem for at finde en metode der virker og samtidig ikke er langsom.
Det eneste jeg er kommet frem til som virker er nedenstående, men det
performer desværre ikke specielt godt. Håber du kan bruge det.



/**
* Scale JPEG image. This method is ugly and slow as hell!
* @param width Width in pixel og new image.
* @param file File to scale.
* @return byte[] with scaled image.
*/
public byte[] createJPEG(int width, File file) throws ScaleException {
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
byte[] newImage;
try {
ImageIcon ii = new ImageIcon(file.getCanonicalPath());

Image i = ii.getImage();

Image resizedImage = null;

int iWidth = i.getWidth(null);
int iHeight = i.getHeight(null);
double scale = (double) iHeight / iWidth;
int newHeight = 0;
if (width == -1) {
newHeight = i.getHeight(null);
width = i.getWidth(null);
}
else {
newHeight = (int) (scale * width);
}

resizedImage = i.getScaledInstance(width, newHeight,
Image.SCALE_SMOOTH);

// This code ensures that all the
// pixels in the image are loaded.
Image temp = new ImageIcon(resizedImage).getImage();

// Create the buffered image.
BufferedImage bufferedImage = new
BufferedImage(temp.getWidth(null), temp.getHeight(null),
BufferedImage.TYPE_INT_RGB);

// Copy image to buffered image.
Graphics g = bufferedImage.createGraphics();

// Clear background and paint the image.
g.setColor(Color.white);

g.fillRect(0, 0, temp.getWidth(null), temp.getHeight(null));

g.drawImage(temp, 0, 0, null);

g.dispose();

// encodes image as a JPEG data stream
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(byteStream);

com.sun.image.codec.jpeg.JPEGEncodeParam param =
encoder.getDefaultJPEGEncodeParam(bufferedImage);

// writeParam = new JPEGImageWriteParam(null);
// writeParam.setCompressionMode(JPEGImageWriteParam.MODE_EXPLICIT);
//writeParam.setProgressiveMode(JPEGImageWriteParam.MODE_DEFAULT);
param.setQuality(0.75F, true);

encoder.setJPEGEncodeParam(param);

encoder.encode(bufferedImage);

byteStream.flush();

newImage = byteStream.toByteArray();

byteStream.close();

return(newImage);
}
catch (IOException e) {
throw new ScaleException(e);
}
catch(Exception e) {
throw new ScaleException();
}
}



--
Jonas Pedersen - jonas(a)chown.dk
http://chown.dk & http://pictureshow.dk
Nyheder på din windows desktop? http://rss.chown.dk

Thomas Bendsen (23-10-2004)
Kommentar
Fra : Thomas Bendsen


Dato : 23-10-04 07:22

In article <da2clc.v14.ln@10.0.0.3>,
Jonas Pedersen <jonasREMOVE@chown.dk> wrote:

> Thomas Bendsen wrote:
> >
> > Er der nogen som kan hjælpe med en algoritme til at foretage en pænere
> > skalering, eller som kan henvise til et godt sted at læse mere om emnet.
> > Der er tale om JPEG-billeder.
> >
>
> Hej
>
> Jeg har selv samme problem og tror snart jeg har været hele nettet
> igennem for at finde en metode der virker og samtidig ikke er langsom.
> Det eneste jeg er kommet frem til som virker er nedenstående, men det
> performer desværre ikke specielt godt. Håber du kan bruge det.


Hej Jonas

Tak for buddet. Jeg vil kigge på det når jeg lige får tid.

Jeg har selv fået det til at virke ved at starte med at anvende en
ConvolveOp (svarende til et blurfilter) på billedet. Så bliver
resultatet temmeligt godt, men det er mildt sagt også langsomt, så det
er meget muligt at din metode er bedre.

--
MVH
Thomas Bendsen

Thomas Bendsen (23-10-2004)
Kommentar
Fra : Thomas Bendsen


Dato : 23-10-04 20:51

Hej


In article <da2clc.v14.ln@10.0.0.3>,
Jonas Pedersen <jonasREMOVE@chown.dk> wrote:
>
> >
> > Hej
> >
> > Jeg har selv samme problem og tror snart jeg har været hele nettet
> > igennem for at finde en metode der virker og samtidig ikke er langsom.
> > Det eneste jeg er kommet frem til som virker er nedenstående, men det
> > performer desværre ikke specielt godt. Håber du kan bruge det.
>
>
> Hej Jonas
>
> Tak for buddet. Jeg vil kigge på det når jeg lige får tid.
>
> Jeg har selv fået det til at virke ved at starte med at anvende en
> ConvolveOp (svarende til et blurfilter) på billedet. Så bliver
> resultatet temmeligt godt, men det er mildt sagt også langsomt, så det
> er meget muligt at din metode er bedre.

Jeg har leget lidt med det, og umiddelbart ser begge metoder ud til at
være nogenlunde lige hurtige, og give nogenlunde samme resultat.

I forhold til mit brug har min metode den fordel at den meget hurtige
skalering og den meget langsomme udglatning er to uafhængige metoder.
Dette betyder at ved små skaleringen kan jeg nemt undlade at udføre
udglatningen.

--
MVH
Thomas Bendsen

Søg
Reklame
Statistik
Spørgsmål : 177458
Tips : 31962
Nyheder : 719565
Indlæg : 6408170
Brugere : 218881

Månedens bedste
Årets bedste
Sidste års bedste