web-dev-qa-db-ja.com

バッファリングされた画像を透明な背景で保存する

署名の画像を.jpg画像として保存しています。私は、graphic2dを使用して、署名のすべてのピクセル(署名タブレットで取得)を画像にペイントします。これは完全に機能しますが、常に白い背景を取得します。 PDF文書に署名を付けたい場合、jpg画像の白い四角形の境界線がPDFの単語の一部を覆っています。

取得したいのは、透明な背景でjpg画像を保存することです。そのため、PDFに配置すると、白い画像の背景で覆われた単語はなく、署名行だけが表示されます。

これは、バッファリングされた画像を保存するコードです。白い背景でやります。

 // 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;
}

私はそれを透明にしようとしたが成功しなかったので、この作業部分を投稿した。

16
Igr

使用する BufferedImage.TYPE_INT_ARGB の代わりに BufferedImage.TYPE_INT_RGB。そして、それをPNG画像に保存します。JPEGは透明度をサポートしていません。

PD:

background transparentを設定するには、次のように使用します。

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

そしてあなたのイメージを描くために:

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

他の人が述べたように、透明度のあるJPEGは保存できません。

ただし、ファイルを(JPEGで、この場合はグレースケールJPEGを使用することをお勧めしますが)後で保存することは可能です解釈白い部分を透明、黒い部分を非透明(つまり、グレースケールイメージをアルファマスクとして使用します)。次に、不透明部分を黒または青に着色して、ペンのインクのように見せます。

白い部分を紙、黒い部分をインクで覆っていると考えてください。この手法は、すべての白いピクセルを透明にする必要があるユースケースでのみ機能することに注意してください。このスレッドの他の回答は、一般的なケースでうまく機能します。

1
haraldK

JPEGは透明度をサポートしていません。たとえば、pngなどの別のターゲット形式を使用する必要があります。

0
LuigiEdlCarno

エンドツーエンドの例を使用する準備ができています

透明度と2 x長方形のpng画像を作成します

コンパイル時間-2019_04_10__00_12_03_236

import javax.imageio.ImageIO;
import Java.awt.*;
import Java.awt.image.BufferedImage;
import Java.io.File;
import Java.io.IOException;
import Java.nio.file.Files;
import Java.nio.file.Path;
import Java.nio.file.Paths;
import Java.time.LocalDateTime;
import Java.time.format.DateTimeFormatter;

// ready to use end to end example
// it will create png picture with transparency and 2 x rectangles
// compilation time - 2019_04_10__00_12_03_236
public class Java_create_png_image_with_transparency_end_to_end_example {

    public static void main(String[] args) throws IOException {
        Path outPath = Paths.get("C:\\_tmp_out_\\");
        if (!Files.exists(outPath)) {
            Files.createDirectory(outPath);
        }

        String timeNow = DateTimeFormatter
                .ofPattern("yyyy_MM_dd__HH_mm_ss_SSS")
                .format(LocalDateTime.now());
        String filename = "test_png_pic__" + timeNow + "__.png";
        File absOutFile = outPath.resolve(filename).toFile();

        int width = 300;
        int height = 300;

        BufferedImage bufferedImage = new BufferedImage(width, height,
                BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2d = bufferedImage.createGraphics();
        g2d.setComposite(AlphaComposite.Clear);
        g2d.fillRect(0, 0, width, height);

        g2d.setComposite(AlphaComposite.Src);
        int alpha = 127; // 50% transparent
        g2d.setColor(new Color(255, 100, 100, alpha));
        g2d.fillRect(100, 100, 123, 123);

        g2d.setColor(new Color(0, 0, 0));
        g2d.fillRect(30, 30, 60, 60);

        g2d.dispose();

        ImageIO.write(bufferedImage, "png", absOutFile);
        System.out.println("File saved to:");
        System.out.println(absOutFile);
    }
}
0
blueberry0xff

バッファリングされたイメージのタイプがRGBのみで、アルファコンポーネントがない場合は、透明度を維持するためにアルファを持つものを使用する必要があります。

0
Java Devil