mergelspir Mester
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.
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?
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.
mergelspir Mester
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.)
01. marts 2021 - 23:31 #4
mergelspir Mester
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.
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.
mergelspir Mester
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
mergelspir Mester
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.
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"));
  }

}
mergelspir Mester
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.
mergelspir Mester
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.
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.
mergelspir Mester
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.
arne_v Ekspert
02. marts 2021 - 15:26 #14
Kunne du emaile mig et ikke roedt billede som bliver roedt ved konvertering?
arne_v Ekspert
02. marts 2021 - 15:26 #15
Laver du aendringer i billedet siden du laeser ind og skriver ud?
mergelspir Mester
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 :-))
mergelspir Mester
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?
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.
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 .
mergelspir Mester
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
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.
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.

Opret Preview

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





Premium
Rådet for Digital Sikkerhed vil have redesignet corona-passet: Der skal deles færre personoplysninger
Interview: Der er alt for mange unødvendige personoplysninger i danskernes coronapas lige nu, mener Rådet for Digital Sikkerhed, der har en række forslag til et redesign af appen. Forslagene kan hjælpe erhvervsdrivende med at komme over barrieren med at skulle tjekke kunders sundhedsoplysninger.
Computerworld
Sikkerhedshul i sundhed.dk gør det let at snyde med coronapas
Et hul i sikkerheden hos sundhed.dk åbner op for, at coronapas-ejere kan ændre på de svar, der står i passet. Men det er dokumentfalsk, advarer sundhed.dks direktør.
CIO
Har du rost din mellemleder i dag? Snart er de uddøde - og det er et tab
Computerworld mener: Mellemledere lever livet farligt: Topledelsen får konstant ideer med skiftende hold i virkeligheden, og moden går mod flade agile organisationer. Men mellemlederen er en overset hverdagens helt med et kæmpe ansvar. Her er min hyldest til den ofte latterliggjorte mellemleder.
Job & Karriere
"Vi var nødt til at sige til dem, at I er nødt til at sende ham hjem nu, for han begynder at knække"
"Vi var nødt til at sige til dem, at I er nødt til at sende ham hjem nu, for han begynder at knække"
White paper
Udnyt ressourcerne bedre og skru op for overskuddet
Spildt arbejde, ineffektive processer og ringe forretningsindsigt er blot tre tegn på ringe ressourceudnyttelse. I dette whitepaper får du viden om, hvordan du måler ressourceudnyttelsen – og bruger indsigten operationelt, taktisk og strategisk.