17

署名の画像を .jpg 画像として保存しています。私はグラフィック 2d を使用して、署名のすべてのピクセル (署名タブレットで取得) を画像にペイントしました。これは完全に機能しますが、常に白い背景が表示されます。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;
}

透明に設定しようとしましたが成功しなかったので、この作業部分を投稿しました。

4

5 に答える 5

52

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

更新:

背景を透明に設定するには、次のように使用します。

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

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

g2d.setComposite(AlphaComposite.Src);
drawPoints(Tablet.getPenPoints(), g2d, Color.BLACK);
于 2013-06-24T09:16:16.697 に答える
2

すぐに使用できるエンド ツー エンドの例

透明度と2つの長方形を持つ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);
    }
}
于 2019-04-10T11:16:09.913 に答える
1

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

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

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

于 2013-06-24T09:18:17.533 に答える
1

バッファリングされた画像を、アルファ コンポーネントを持たない RGB のみのタイプに設定しています。透明度を維持するには、アルファを持つものを使用する必要があります。

于 2013-06-24T09:14:49.730 に答える