Salva l’immagine bufferizzata con lo sfondo trasparente

Sto salvando l’immagine di una firma come immagine .jpg. Uso graphic2d per dipingere sull’immagine ogni pixel della firma (ottenuto con una tavoletta grafica) e funziona perfettamente, ma ho sempre uno sfondo bianco. Se voglio mettere la firma su un documento PDF, i bordi del quadrato bianco dell’immagine jpg coprono alcune delle parole del PDF.

Quello che voglio ottenere è salvare l’immagine jpg con uno sfondo trasparente, quindi quando la metto sul PDF non ci sono parole coperte con lo sfondo bianco dell’immagine ma solo le linee della firma.

Questo è il codice che salva l’immagine bufferizzata. Lo fa con lo sfondo bianco.

// This method refers to the signature image to save private RenderedImage getImage() { int width = tabletWidth; int height = tabletHeight; // Create a buffered image in which to draw BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // Create a graphics contents on the buffered image Graphics2D g2d = bufferedImage.createGraphics(); // Draw graphics g2d.setColor(Color.WHITE); g2d.fillRect(0, 0, width, height); drawPoints(Tablet.getPenPoints(), g2d, Color.BLACK); // Graphics context no longer needed so dispose it g2d.dispose(); return bufferedImage; } 

Ho provato a renderlo trasparente ma senza successo, quindi ho pubblicato questa parte funzionante.

Usa BufferedImage.TYPE_INT_ARGB invece di BufferedImage.TYPE_INT_RGB . E salvarlo in un’immagine PNG , JPEG non supporta la trasparenza.

UPD:

Per impostare lo sfondo trasparente, usalo:

 g2d.setComposite(AlphaComposite.Clear); g2d.fillRect(0, 0, w, h); 

E per disegnare la tua immagine:

 g2d.setComposite(AlphaComposite.Src); drawPoints(Tablet.getPenPoints(), g2d, Color.BLACK); 

Come altri hanno già detto, non è ansible salvare i JPEG con trasparenza.

Tuttavia, è ansible memorizzare il file come si fa (in JPEG, anche se suggerisco di utilizzare un JPEG in scala di grigi in questo caso) e interpretare in seguito le parti bianche come trasparenti, e le parti nere come non trasparenti (es .: utilizzare l’immagine in scala di grigi come maschera alfa). Quindi è ansible colorare semplicemente le parti non trasparenti, nere o blu, per sembrare inchiostro a penna.

Pensa all’area bianca come alla carta e alle parti nere coperte da inchiostro. Nota che questa tecnica funzionerà solo per il caso d’uso in cui tutti i pixel bianchi dovrebbero essere trasparenti. Altre risposte in questo thread funzioneranno meglio nel caso generale.

JPEG non supporta transperency. Ad esempio, devi utilizzare un formato di destinazione diverso come png.

Stai impostando l’immagine bufferizzata con un tipo di solo RGB che non ha componenti Alpha, dovrai usarne uno che abbia alpha per mantenere la trasparenza.