java - 如何在 Android 的可绘制对象中交换红色和蓝色?

标签 java android colorfilter

谁能告诉我一种在 Android 中将滤色器应用到基本上会变成蓝红色和红蓝色的 Drawable 的有效方法?

我在 Java 中有一个功能示例,但这在 Android 中不兼容:

public class ColourSwapTest extends JFrame {

    private JPanel panel;
    private boolean altImageOnShow = false;

    public static void main(String[] args){
        new ColourSwapTest();
    }

    public ColourSwapTest(){
        init();

        Container container = this.getContentPane();

        panel = new JPanel(){
            @Override
            public void paint(Graphics g){
                if (altImageOnShow){
                    g.drawImage(img, 0, 0, null);
                }
                else {
                    g.drawImage(src, 0, 0,  null);
                }
            }
        };
        panel.addMouseListener(new MouseAdapter(){
            @Override
            public void mouseClicked(MouseEvent arg0){
                // alternate between original and filtered image
                if (altImageOnShow){
                    altImageOnShow = false;
                }
                else {
                    altImageOnShow = true;
                }
                repaint();
            }
        });
        container.add(panel, BorderLayout.CENTER);

        this.setSize(800,600);
        this.setLocationRelativeTo(null);
        this.setVisible(true);
    }

    private String dir = "c:/Test Images/2.jpg";
    private Image src;
    private ImageFilter colourFilter;
    private Image img;

    /**
     * init()
     */
    private void init(){
        try {  
            src = ImageIO.read(new File(dir));  
        }
        catch (IOException e) {  
            e.printStackTrace();
        }
        colourFilter = new RedBlueSwapFilter();
        // apply filter to new image
        img = createImage(new FilteredImageSource(src.getSource(), colourFilter));
    }

    /**
     * CLASS
     * RedBlueSwapFilter
     */
    class RedBlueSwapFilter extends RGBImageFilter {
        public RedBlueSwapFilter() {
            canFilterIndexColorModel = true;
        }

        public int filterRGB(int x, int y, int rgb) {
            return ((rgb & 0xff00ff00)
                    | ((rgb & 0xff0000) >> 16)
                    | ((rgb & 0xff) << 16));
        }
    }
}

这只会加载在 C:\Test Images\2.jpg 中找到的图像,并在您单击它时在其原始状态和更改后的状态之间切换。

如果有人可以就如何将此应用到 Android 中提出建议,我将不胜感激。谢谢。

编辑:我应该补充一点,点击图像来切换它是完全不重要的,这正是我为了演示它的工作所做的。我需要的关键是在运行时以编程方式尽可能高效地翻转红色和蓝色。

最佳答案

我已经解决了,伙计们。方法如下:

private Drawable invertImage(Drawable inputDrawable){
    Bitmap bitmap = ((BitmapDrawable) inputDrawable).getBitmap();

    int width = bitmap.getWidth();
    int height = bitmap.getHeight();

    int[] pixels = new int[width * height];
    bitmap.getPixels(pixels, 0, width, 0, 0, width, height);

    int[] finalArray = new int[width * height];

    for(int i = 0; i < finalArray.length; i++) {
        int red = Color.red(pixels[i]);
        int green = Color.green(pixels[i]);
        int blue = Color.blue(pixels[i]);
        finalArray[i] = Color.rgb(blue, green, red);
    }
    bitmap = Bitmap.createBitmap(finalArray, width, height, Bitmap.Config.ARGB_8888);

    return new BitmapDrawable(getResources(),bitmap);
}

关于java - 如何在 Android 的可绘制对象中交换红色和蓝色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20903423/

相关文章:

java - 如果 Java 中的正则表达式模式匹配,则提取文件的下一行数据

android - 我的所有 Toasts 文本都显示在中心之外

android - BottomSheetDialog 没有显示?

java - 抛出奇怪的 org.threeten.bp.DateTimeException?

java - ColorFilter 仅特定颜色

android - 了解使用 ColorMatrix 和 ColorMatrixColorFilter 修改 Drawable 的色调

java - 这个稀疏数组是如何工作的(AP CS 2015 Q3)

java - 无法到达链接 th :src route on thymeleaf