java - 如何编辑图像中像素的位图

标签 java android bitmap steganography

我写了一个隐写算法,但是需要很长时间才能完成。这是因为我创建了一个新的位图实例 BitmapStegan,并且从旧位图 bitmap 中获取每个像素。无论我是否修改它,我都必须将它设置在新的位图对象中。因此,我最终会循环遍历所有像素,即使我只需要编辑其中的一些像素。

我该如何解决这个问题?

Bitmap BitmapStegan = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig());
for(int i=0; i<bitmap.getWidth(); i++){
    for(int j=0; j<bitmap.getHeight(); j++){
        int pixel=bitmap.getPixel(i, j);
        int red= Color.red(pixel);
        int green=Color.green(pixel);
        int blue=Color.blue(pixel);

        if (NumberBitsInMessage>0) {
            /*
            I put here my bit to red and greed and blue with LSB method
            */
        }
        BitmapStegan.setPixel(i, j, Color.argb(Color.alpha(pixel), red, green, blue));
    }
}
imageView.setImageBitmap(BitmapStegan);

最佳答案

首先,您真的需要原始图像的副本吗?如果是,因为您想比较原始图像和隐写图像之间的统计差异,所以您需要 create a copy of your bitmap 。这样,您可以一次性创建所有像素,速度更快。如果您不需要副本,只需将更改直接应用到原始图像对象即可。无论哪种方式,您只需要修改一个图像,从现在开始我将其称为image

现在,对于如何迭代足够的像素进行嵌入,您有两种选择。要么对图像的行和列使用循环,并在嵌入整个 secret 后打破它们,要么为 NumberBitsInMessage 创建一个计数器,并在嵌入位时显式更改像素坐标。

1。跳出循环

embedding:
for (int i = 0; i < image.getWidth(); i++) {
    for (int j = 0; j < image.getHeight(); j++) {
        if (NumberBitsInMessage == 0) {
            break embedding;
        }

        int pixel = image.getPixel(i, j);
        int red = Color.red(pixel);
        int green = Color.green(pixel);
        int blue = Color.blue(pixel);

        /*
        modify pixel logic here
        */
        image.setPixel(i, j, Color.argb(Color.alpha(pixel), red, green, blue));
    }
}

2。嵌入位计数器

int width = 0;
int height = 0;
int maxHeight = image.getHeight();

for (int embeddedBits = 0; embeddedBits < NumberBitsInMessage; ) {
    int pixel = image.getPixel(width, height);
    int red = Color.red(pixel);
    int green = Color.green(pixel);
    int blue = Color.blue(pixel);

    /*
    modify pixel logic here
    don't forget to increase `embeddedBits` for each colour you modify
    */
    image.setPixel(width, height, Color.argb(Color.alpha(pixel), red, green, blue));

    height++;
    if (height == maxHeight) {
        width++;
        height = 0;
    }
}

关于java - 如何编辑图像中像素的位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46156596/

相关文章:

java - JSP 中的 JDBC 连接 :java. lang.RuntimePermission accessClassInPackage.sun.jdbc.odbc

python - 需要在 Android 上的 Termux 上运行 Python 3.8.x,目前与 Python 3.9 一起安装

android - (android) 当屏幕宽度已满时,如何将继续的图像放在下一行?

java - android中用于照明解决的位图归一化

android - 对位图使用异步任务

java - 如何扩展 Flogger Fluent API 以获取特定于域的属性?

java - 在 NetBeans 中将 JSP 保存为 UTF-8

c++ - 使用(MFC 的)CImage::SetPixel() 改变像素的颜色

java - Spark 中 withColumn 的 Java 等效实现

android - 获取最准确位置的方法