动态生成透明跟踪像素

Posted

技术标签:

【中文标题】动态生成透明跟踪像素【英文标题】:Dynamically Generate Transparent Tracking Pixel 【发布时间】:2010-12-28 19:20:31 【问题描述】:

我正在尝试在 Java 中动态生成清晰的跟踪像素,但遇到了一些问题。将此返回给用户没有问题,但我似乎无法正确获取像素。我做错了什么?

这就是我所拥有的,它给了我一个 1x1 白色像素。如何使其尽可能小(文件大小)并使其透明?

BufferedImage singlePixelImage = new BufferedImage(1, 1, BufferedImage.TYPE_BYTE_GRAY_TYPE);
singlePixelImage.setRGB(0, 0, 0xFFFFFF);

【问题讨论】:

【参考方案1】:

我认为灰色图像类型不支持透明度。仅修改了 Łukasz 的答案以准确显示正在发生的事情。当您创建新图像时,它的所有像素的初始值都设置为 0。这意味着它是完全透明的。在下面的代码中,我明确表示:

    BufferedImage singlePixelImage = new BufferedImage(1, 1, BufferedImage.TYPE_4BYTE_ABGR);
    Color transparent = new Color(0, 0, 0, 0);
    singlePixelImage.setRGB(0, 0, transparent.getRGB());

    File file = new File("pixel.png");
    try 
        ImageIO.write(singlePixelImage, "png", file);
     catch (IOException e) 
        // TODO Auto-generated catch block
    

【讨论】:

【参考方案2】:

这是对@Rekin 的答案的改编,用于写入字节数组而不是文件。

动态生成的跟踪图像

public static byte[] get1x1PixelImage() throws IOException

    // The following code was used to generate the tracking pixel.
    BufferedImage singlePixelImage = new BufferedImage(1, 1, BufferedImage.TYPE_4BYTE_ABGR);
    Color transparent = new Color(0, 0, 0, 0);
    singlePixelImage.setRGB(0, 0, transparent.getRGB());

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ImageIO.write(singlePixelImage, "png", baos);
    byte[] imageInBytes = baos.toByteArray();
    baos.close();

    return imageInBytes;

获取静态跟踪图片

// Use either format, tracking gif is smaller then the png.
static byte[] trackingGif =  0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x1, 0x0, 0x1, 0x0, (byte) 0x80, 0x0, 0x0, (byte)  0xff, (byte)  0xff,  (byte) 0xff, 0x0, 0x0, 0x0, 0x2c, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x2, 0x2, 0x44, 0x1, 0x0, 0x3b ;
static byte[] trackingPng = (byte)0x89,0x50,0x4E,0x47,0x0D,0x0A,0x1A,0x0A,0x00,0x00,0x00,0x0D,0x49,0x48,0x44,0x52,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x08,0x06,0x00,0x00,0x00,0x1F,0x15,(byte)0xC4,(byte)0x89,0x00,0x00,0x00,0x0B,0x49,0x44,0x41,0x54,0x78,(byte)0xDA,0x63,0x60,0x00,0x02,0x00,0x00,0x05,0x00,0x01,(byte)0xE9,(byte)0xFA,(byte)0xDC,(byte)0xD8,0x00,0x00,0x00,0x00,0x49,0x45,0x4E,0x44,(byte)0xAE,0x42,0x60,(byte)0x82;

public static byte[] get1x1PixelImage() 
    return trackingGif;   // trackingGif is about 38 bytes where trackingPng is 68

【讨论】:

【参考方案3】:

我认为创建一个具有适当类型的 BufferedImage 就足够了。不需要调用 setRGB 方法。试试这个:

BufferedImage singlePixelImage = new BufferedImage(1, 1, BufferedImage.TYPE_4BYTE_ABGR);

// then I'm saving the generated image in file:
File file = new File("pixel.png");
try 
   ImageIO.write(singlePixelImage, "png", file);
 catch (IOException e) 
   // TODO Auto-generated catch block
   e.printStackTrace();

我在 Adob​​e PhotoShop 中检查了 pixel.png 文件,它是透明的。

BufferedImage.TYPE_4BYTE_ABGR 告诉添加一个额外的第四个字节,用于存储有关 Alpha 通道值(像素的透明度)的信息。

【讨论】:

【参考方案4】:

如果这是一个跟踪像素,为什么要每次都生成它?生成一次,将其编码为 GIF 或 PNG 图像,然后仅将这些字节发送回 HTTP 客户端。这要容易得多。

【讨论】:

我不是每次都生成它。问题在于像素本身。 我认为TYPE_BYTE_GRAY_TYPE 不支持透明度。改用 RGBA(红、绿、蓝、alpha)。 我做了,但我对传入的 int 值一无所知。有什么想法吗?

以上是关于动态生成透明跟踪像素的主要内容,如果未能解决你的问题,请参考以下文章

Javascript以dataURL格式生成透明的1X1像素

如何使用 SASS 动态生成 CSS3 关键帧步骤?

透明位图的显示 作者:王骏

似乎无法使用动态生成的元素ID

PHP使用不透明度生成半透明背景颜色影响文本

Java - 跟踪抽象形状的轮廓并使外部像素透明