【问题标题】:how to edit a bitmap of the pixels in an image如何编辑图像中像素的位图
【发布时间】:2018-02-19 17:57:27
【问题描述】:

我写了一个隐写算法,但是需要很长时间才能完成。这是因为我创建了一个新的位图实例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);

【问题讨论】:

  • 您可以一次获取或设置所有像素,只需使用 Bitmap.getPixels/setPixels 方法。它会更快。
  • 由于您没有向我们展示您的嵌入逻辑,我做出了合理的假设,即NumberBitsInMessage 是您必须嵌入的位数,并且对于每一位,您将其减少 1。所以,只要它是正数,您就可以嵌入更多位。如果我的假设不正确,请澄清。
  • @Reti43 你的假设是正确的。我的问题是当 **NumberBitsInMessage ** 小于 0 时,我必须继续将 auther 像素复制到 BitmapStegan

标签: java android bitmap steganography


【解决方案1】:

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

现在,您有两种选择,即如何迭代仅用于嵌入的足够像素。要么对图像的行和列使用循环,并在嵌入整个秘密后将它们断开,要么为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;
    }
}

【讨论】:

  • 我将更改直接应用到原始图像对象但应用程序破解我认为必须执行这行代码'Bitmap BitmapStegan = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight (), bitmap.getConfig());'当你完成嵌入我的消息秘密时,我无法爆发
  • 我不明白你的意思。您的程序是否在createBitmap() 行抛出错误?我提供的任何代码都不应该影响该行。
  • 我在 Bitmap.setPixel 有这个错误'java.lang.IllegalStateException'。我无法编辑原始位图
  • 你先说createBitmap()有问题,然后setPixel()有问题。除了为您提供不遍历每个像素的逻辑之外,我的回答不应该干扰任何这些。如果除了我描述的代码/解释之外,您还进行了更多更改,那么您正在处理一个新问题,您应该提出一个新问题。如果问题出在我提供的代码上,您应该更加明确。但也许你的Bitmap is not mutable
  • 谢谢。当我实现代码时,我没有 mutable bitmap 。现在它运行良好,我的代码需要很短的时间
猜你喜欢
  • 2011-02-14
  • 1970-01-01
  • 2011-07-07
  • 2017-08-07
  • 1970-01-01
  • 2020-03-29
  • 2018-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多