使背景在图像中透明。(附图示例)

时间:2015-09-07 10:42:51

标签: java android android-studio

如何从图像中删除白色背景颜色(白色)? 要么 想让图像背景透明。

enter image description here

这是两张图片 图1是:带有白色背景的文本
图像2是:绿色(或接近绿色)图像

我需要使白色删除背景透明的图像1

4 个答案:

答案 0 :(得分:0)

Here is an exampl使图片中的BLUE颜色透明。 enter image description here

  

这里我们有一个像蓝色背景的图像,我们想在具有白色背景的Applet中显示它。我们所要做的就是用" Alpha位"来寻找蓝色。设置为不透明并使它们透明。

您可以调整它并使WHITE颜色透明。

您也可以查看this answer

答案 1 :(得分:0)

问题是,你想在运行时使透明背景或只是这个图像?如果只是这个,那么您应该使用irfanView之类的任何工具编辑图像以删除背景颜色。只需在此工具中打开此图像,然后将其保存为PNG并勾选保存透明色并取消勾选使用窗口背景颜色,然后按Enter键。之后选择白色。

答案 2 :(得分:0)

你可以用photoshop轻松完成。

使用魔棒或套索工具,选择您想要透明的图像区域。 enter image description here

然后点击DELETE按钮。

enter image description here

有关其他信息,请查看此link

您还可以查看此tutorial

此处有用video

答案 3 :(得分:0)

当我必须解决这个问题时,我使用了一个缓冲区...

private IntBuffer buffer;
public void toBuffer(File tempFile){
    final Bitmap temp = BitmapFactory.decodeFile(imgSource
            .getAbsolutePath());
    buffer.rewind(); //setting the buffers index to '0'
    temp.copyPixelsToBuffer(buffer);
}

然后您可以简单地编辑缓冲区中的所有像素(int-values)(如https://stackoverflow.com/users/3850595/jordi-castilla所述)... ...将0xFFFFFFFF(白色和透明)的ARGB设置为0x00??????(任何颜色都适合,无论如何都是透明的)

所以这是你在缓冲区上编辑透明的代码:

public void convert(){
    for (int dy = 0; dy < imgHeight; dy ++){            
        for (int dx = 0; dx < imgWidth; dx ++ ){

            int px = buffer.get();
            int a = (0xFF000000 & px) >> 24;
            int r = (0x00FF0000 & px) >> 16;
            int g = (0x0000FF00 & px) >> 8;
            int b = (0x000000FF & px);

            int result = px;    

            if (px == 0xFFFFFFFF){ //only adjust alpha when the color is 'white'
               a = 0xFF000000; //transparent? 
               int result = a | r | g | b;
            }

            int pos = buffer.position();
            buffer.put(pos-1, result);
        }       
    }

稍后您要将图像写回转换后的文件:

public void copyBufferIntoImage(File tempFile) throws IOException {
    buffer.rewind();
    Bitmap temp = Bitmap.createBitmap(imgWidth, imgHeight,
            Config.ARGB_8888);
    temp.copyPixelsFromBuffer(buffer);

    FileOutputStream out = new FileOutputStream(tempFile);
    temp.compress(Bitmap.CompressFormat.PNG, 90, out);
    out.flush();
    out.close();
}

也许你还想知道如何映射缓冲区?

    public void mapBuffer(final File tempFile, long size) throws IOException {

    RandomAccessFile aFile = new RandomAccessFile(tempFile, "rw");
    aFile.setLength(4 * size); // 4 byte pro int
    FileChannel fc = aFile.getChannel();
    buffer = fc.map(FileChannel.MapMode.READ_WRITE, 0, fc.size())
            .asIntBuffer();

}