Avatar billede mergelspir Seniormester
01. marts 2021 - 20:28 Der er 21 kommentarer

Andy Warhol look alike billeder :-(

En sjælden gang bliver "mine" jpg-billeder rødlige (Andy Warhol look alike)

Jeg har kogt det ned til følgende linier kode:
BufferedImage imageio = ImageIO.read(new File("billede_ind.jpg"));
ImageIO.write(imageio, "jpg", new File("billede_ud.jpg"));

Nogle har foreslået at de billeder, der bliver rødlige er ARGB, mens de normale er RGB.
Men, jeg har checket imageio.getColorModel() som er den samme, både på de billeder, der forbliver normale, og de billeder, der bliver røde:
ColorModel: #pixelBits = 24 numComponents = 3 color space = java.awt.color.ICC_ColorSpace@6539841e transparency = 1 has alpha = false isAlphaPre = false

Jeg antager, at det er læse-operationen, der er problemet.
Hvis det var skrive-operationen, så ville det vel gå ud over alle billederne.

Jeg har forsøgt at dykke ned i Javas jpg-billedformater, men jeg kan ikke finde nogle gode beskrivelser.

Er der nogen, der kan fortælle mig, hvad der sker?

Jeg bruger Java1.7
Og nej, lad nu være med at foreslå en nyere version. Det er ikke en option.
Avatar billede arne_v Ekspert
01. marts 2021 - 20:51 #1
Jeg ved ikke meget om JPEG format.

Men problemet må vel kunne anrgibres systematisk.

Er problemet fast ved visse bileder således at et bestemt billede altid bliver røde, mens de fleste billeder aldrig bliver røde?

Hvis ja så må man jo undersøge det billede.

Bliver det også rødt når man åbner og gemmer i et andet program f.eks. Paint?

Hvis man kigger på attributterne (header felterne) er der forskel på dette billede og de billeder som ikke har problemet?
Avatar billede arne_v Ekspert
01. marts 2021 - 20:54 #2
Jeg forst[r at du ikke kan opdatere (ikke så usædvaneligt - 15% af verdens Java brugere skulle bruge Java 7 eller ældre!).

Men defor kunen det alligevel være interessant at se om problemet findes i Java 11.

Og se om problemet findes i Java 7 på en anden platform.
Avatar billede mergelspir Seniormester
01. marts 2021 - 23:01 #3
"Er problemet fast ved visse billeder, således at et bestemt billede altid bliver røde, mens de fleste billeder aldrig bliver røde?" ja!

"Bliver det også rødt når man åbner og gemmer i et andet program f.eks. Paint?" Nej!

Jeg har nu sat et rødt billede som profilbillede. Når du har kommenteret på dette indlæg, vil jeg uploade det oprindelige billede som profilbillede. (Det er min workaround på ikke at kunne uploade billeder.)
Avatar billede erikjacobsen Ekspert
01. marts 2021 - 23:31 #4
Avatar billede mergelspir Seniormester
02. marts 2021 - 11:11 #5
Ja, jeg har set beskrivelsen i stackoverflow.
Det ser ud til at være den samme effekt, men når jeg bruger billede, som er vist i stackoverflow-linket, så har jeg ikke problemer med at læse/skrive det.
Avatar billede claes57 Ekspert
02. marts 2021 - 11:33 #6
så du den tilføjelsen?
It was the Alpha value. Fixed by :

BufferedImage image = new
BufferedImage(iw,ih,BufferedImage.TYPE_INT_RGB); //RGB, jpeg hasnt got alpha, ints have been converted as if they contain red first, but its alpha(the first bytes, these ints are interpreted bitwise i think) (argb), so it became more red.
Avatar billede mergelspir Seniormester
02. marts 2021 - 12:14 #7
Ja, jeg så gjort tilføjelsen og synes, at jeg har prøvet begge:
https://www.yachtdatabase.com/da/test_imageInfo.jsp?filename=86878_1_org.jpg
Avatar billede mergelspir Seniormester
02. marts 2021 - 12:25 #8
Derudover er ColorModel: #pixelBits = 24 numComponents = 3 color space = java.awt.color.ICC_ColorSpace@3d83b5a1 transparency = 1 has alpha = false isAlphaPre = false
Hvis alpha er benyttet i det oprindelige billede, så havde jeg forventet noget ala:
ColorModel: #pixelBits = 32 numComponents = 4 color space = java.awt.color.ICC_ColorSpace@3d83b5a1 transparency = 1 has alpha =  true isAlphaPre = true.
Avatar billede erikjacobsen Ekspert
02. marts 2021 - 12:33 #9
Jeg kan nok ikke løse dit problem, men det er da interessant. Nedenstående giver et fint billede i java 11 - men du skal bruge 7, som jeg læser det.

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

public class Foto {

  public static void main(String[] args) throws java.io.IOException {
    System.out.println("Here we go");
    BufferedImage imageio = ImageIO.read(new File("86878_1_org.jpg"));
    //Plain write like this:
    ImageIO.write(imageio, "jpg", new File("xxxxxx_86878_1_org.jpg"));
  }

}
Avatar billede mergelspir Seniormester
02. marts 2021 - 13:02 #10
Ja, mit webhotel (Levonline.com) er teknisk set temmeligt langt bagud, når det kommer til Java, og deres administration er håbløs. MEN deres teknikkere er første klasses. De svarer meget hurtigt og kvalificeret, når jeg har spørgsmål. Derudover er jeg også godt tilfreds med deres båndbredde. Mit site har temmelig meget trafik.
Avatar billede mergelspir Seniormester
02. marts 2021 - 13:59 #11
Det ser ud til, at problemet er tidligere meldt som en fejl.
https://bugs.openjdk.java.net/browse/JDK-8180746

Skulle nogen have en workaround til Java version 1.7?
Jeg afprøver meget gerne alle forslag.
Avatar billede arne_v Ekspert
02. marts 2021 - 14:56 #12
Problemet er mere diffust end som saa.

Jeg tod PNG of Java kode fra det link og tested med:

Java 5 (32 bit)
Java 5 (64 bit)
Java 6 (32 bit)
Java 6 (64 bit)
Java 7 (32 bit)
Java 7 (64 bit)
Java 8 (32 bit)
Java 8 (64 bit)
Java 11 (64 bit)

SUN/Oracle build, seneste public update, Windows 7.

Ingen fejl.

Så der er er et eller andet som skal til for at trigge fejlen.
Avatar billede mergelspir Seniormester
02. marts 2021 - 15:08 #13
Jeg har kikket på pixel (0,0) på det indlæste billede.
Den har farverne:
a:255
r:229
g:133
b:126
Det passer jo fint med, at billedet er rødt.
Så kunne man jo forledes til at tro, at det havde noget med Alpha-værdien at gøre.
MEN, Men, men, Alpha-værdierne er også 255 på de billeder, der bliver læst og skrevet igen korrekt. SUK...

Måske løsningen er at benytte en anden indlæsningsmetode end ImageIO.
Avatar billede arne_v Ekspert
02. marts 2021 - 15:26 #14
Kunne du emaile mig et ikke roedt billede som bliver roedt ved konvertering?
Avatar billede arne_v Ekspert
02. marts 2021 - 15:26 #15
Laver du aendringer i billedet siden du laeser ind og skriver ud?
Avatar billede mergelspir Seniormester
02. marts 2021 - 16:53 #16
Nej jeg læser ind og skriver ud:

BufferedImage imageio = ImageIO.read(new File("billede_ind.jpg"));
ImageIO.write(imageio, "jpg", new File("billede_ud.jpg"));

Intet mystisk (ud over at det altså ER mystisk :-))
Avatar billede mergelspir Seniormester
02. marts 2021 - 17:04 #17
Nogen ide om, hvor man kan læse om filformatet på en JPEG-fil?
Det må være beskrevet et eller andet sted?
Avatar billede arne_v Ekspert
02. marts 2021 - 17:19 #18
JPEG format er defineret i ISO 10918.

Men jeg kan ikk elige finde en gratis beskrivelse af formatet.
Avatar billede arne_v Ekspert
02. marts 2021 - 17:20 #19
Hvis du ikke skal modificere image kunne du saa ikke bare kopiere bytes?

Fra FileInputStream til FileOutputStream .
Avatar billede mergelspir Seniormester
02. marts 2021 - 17:57 #20
Jeg har behov for at kunne nedskalere store billeder.

Har iøvrigt fundet en beskrivelse her:
https://en.wikipedia.org/wiki/JPEG_File_Interchange_Format
Avatar billede arne_v Ekspert
02. marts 2021 - 20:24 #21
Det er ikke helt nemt at finde et JPEG library for Java 7.

:-)

Men jeg tror at jeg har fundet noget som maaske virker.

ImageJ gammel version ij149v.jar

import java.io.*;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;

import ij.ImagePlus;

public class T3 {
    public static void main(String[] args) throws Exception {
        ImagePlus img = new ImagePlus("before.jpg");
        BufferedImage buf = img.getBufferedImage();
        ImageIO.write(buf, "jpg", new File("after.jpg"));
    }
}

Det gode ved det er at du faar et BufferedImage d.v.s. at det ikke skulle paavirke den kode ret meget.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester