压缩为 png 时位图颜色发生变化

2024-06-24

我目前正在开发一个隐写 Android 应用程序作为一个班级项目。我创建了一个对象,它将在另一个图像中对图像进行编码并返回编码的位图。该代码在单独的线程中运行。

new Thread(new Runnable()  
{  
   public void run()  
    {  
        Bitmap encoded_image = null;  
        Encryptor encryptor = new Encryptor();  
        encoded_image = encryptor.encode_image_in_image(  
            image_location,message_image_location);  
    }  
}).start();

对位图进行编码后,我将位图传递到我创建的文件浏览器活动,以将位图保存为 png 图像。此方法适用于较小的图像,但是,当对大图像进行编码并将其传递到子活动时,应用程序会冻结并返回到主活动。

private void pass_image_to_file_browser( Bitmap image )
{
    Intent intent = new Intent(Encrypt.this,FileBrowser.class);
    intent.putExtra( Intent.EXTRA_STREAM, image );
    startActivity( intent );
}

@Override
 public void onCreate(Bundle savedInstanceState) 
 {
    super.onCreate(savedInstanceState);
    Bundle bundle = this.getIntent().getExtras();
    Bitmap image = bundle.getParacable(Intent.EXTRA_STREAM);
 }

我假设大位图太大,无法使用意图在活动之间发送,因此我决定简单地将图像保存在临时位置并将图像的位置传递给子活动。然后将 png 图像保存在用户指定的位置并删除临时图像文件。

private void save_bitmap( Bitmap image, String location )
{
    FileOutputStream fileOutputStream = new FileOutputStream(location);
    BufferedOutputStream buffered_output_stream = new 
        BufferOutputStream(fileOutputStream);
    image.compress(CompressFormat.PNG, 0, buffered_output_stream);
    buffered_output_stream.flush();
    buffered_output_stream.close();
}

这解决了将大位图从一个活动发送到另一个活动的问题,但是,却产生了一个我无法解决的新问题。在将文件位置传递给子活动之前保存的临时图像和使用文件浏览器重新保存图像后的图像文件的颜色都略有变化。这种颜色变化肉眼无法识别,但在解码图像时会引起很多问题。 我的一个想法是 Bitmap.Config 正在从 ARGB_8888 更改为 ARGB_4444 或 RGB_565,但是,调试后情况并非如此。位图被实例化为 ARGB_8888 并保存为 ARGB_8888 位图,并且其间不会发生变化。如果我将整个位图传递给文件浏览器活动并且在两个位置保存完全相同的位图,则代码仍然有效。我不知道还有什么可能导致这种情况。我正在寻找有关其他可能导致问题的原因的建议。抱歉,我打算在这两种情况下在输出上发布图像,但是堆栈溢出不会让我达到我的声誉水平,谢谢。


好吧,在浪费了很多时间担心线程和我用来编码位图的算法之后,问题变得简单了一些。在解码要使用我正在使用的消息进行编码的图像文件时options.inPreferredConfig = Config.ARGB_8888;在调试过程中,我进行了检查以确保它不会更改为 RGB_565。尽管位图对象被加载为 ARBG_8888,但图像文件不包含 Alpha 通道,因此即使位图有一个用于 Alpha 级别的字节,并且允许我通过以下方式编辑像素的 Alpha 字节:Bitmap.setPixel( x, y, color)位图对象从未意识到它设置了 alpha 值。当压缩位图时,由于对象认为没有 Alpha 通道,因此压缩为 RGB_565。不知何故,通过将位图传递给子活动并解析它来解决这个问题。我猜测当重新创建对象时,我设置的 alpha 值被识别。为了解决不将位图传递给子活动的问题,必须在从文件中解码位图后添加一个 Alpha 通道。我找到了一个函数可以做到这一点here http://android.amberfog.com/?p=430.

private Bitmap adjustOpacity( Bitmap bitmap )
{
    int width = bitmap.getWidth();
    int height = bitmap.getHeight();
    Bitmap dest = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    int[] pixels = new int[width * height];
    bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
    dest.setPixels(pixels, 0, width, 0, 0, width, height);
    return dest;
} 

不知道是否有更有效的方法

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

压缩为 png 时位图颜色发生变化 的相关文章

随机推荐

  • 从每个 UIWebView 请求中获取 http 响应代码

    我需要在加载 webview fo 中的任何 url 时检查响应状态代码 现在 我们可以考虑我在 Web 视图中加载的任何 Web 应用程序 因此 我需要跟踪该 Web 视图中的每个请求并相应地检查响应代码 为了查找响应代码 我需要在 ui
  • 无法加入交易

    我有问题 我已经在 Windows 中设置了 1 个 sql 服务器 SQL Server 2014 Express 并在另一台服务器的 Linux 中设置了 1 个 Oracle 数据库服务器 11g 现在我想通过链接服务器将数据从SQL
  • 改进 IntelliJ 注释(git Blame)

    我想改进 注释选项 右键单击代码行号冒号 gt 注释 它类似于 gitblame 但集成到 IntelliJ 1 这可能吗 通过插件或 IntelliJ 文件的原始修改 还有其他什么吗 2 我使用的是 Android Studio 基于 I
  • Rails 生成迁移

    我目前有一个名为 产品 的迁移 我只想在此迁移中添加更多字符串 例如描述和产品类型 做这个的最好方式是什么 class CreateProducts lt ActiveRecord Migration def change create t
  • 纹理大小的限制?安卓 Open GL ES 2.0

    我想知道可用于任何 Android Opengl Es 2 0 项目的纹理大小是否有任何限制 据我所知 尺寸为 4096x4096 的巨大纹理意义不大 因为它是在小屏幕上渲染的 但是 如果要求是在运行时在许多纹理之间切换怎么办 如果我想要一
  • Web 服务和 Windows 服务有什么区别?

    Web 服务和 Windows 服务有什么区别 我的经验主要是 Windows 服务 我从未创建过 Web 服务 Web 服务的行为与 Windows 服务类似吗 他们可以安排日程 在特定时间运行等吗 您何时会使用 Web 服务代替 Win
  • Java读取不同类型的图像格式jpg,tif,gif,png

    我正在尝试读取一些图像文件 jpg tif gif png 并需要保存文件并创建图标 我越来越UnsupportedTypeException ImageIO read file 如果我使用以下行 如前面在表格中讨论的那样 Buffered
  • 为什么我的 RSpec 规格运行两次?

    我在我的文件中定义了以下 RSpec 1 3 0 任务Rakefile require spec rake spectask Spec Rake SpecTask new spec do spec spec libs lt lt lib l
  • play 框架 - 如何让 play 接受 yaml 文件中的“null”值?

    我正在尝试从 YAML 文件加载数据 其中某些字段包含 空 值 当 Play Framework 尝试解析 null 值时 它会抛出以下异常 play exceptions YAMLException null mapping values
  • 为什么我的邮件发件人与我的发件人标头不同是可以接受的?

    关于 SPF 有件事一直困扰着我 为什么它不验证 From 标头 据我了解 SMTP 服务器将 SPF 验证 MAIL FROM 或 ENVELOPE FROM SMTP 命令期间提供的主机名 我的示例是从 telnet ing 到 gma
  • 如何通过使用程序(Java代码)运行Jmeter测试来在java代码中设置CSV文件?

    我之前曾问过如何在使用 java 程序运行 jmeter 测试后记录结果的问题 然后我自己得到了这个问题 所以我将分享该问题的链接和答案以供将来参考 所以这是链接 使用程序 JAVA 代码 运行 Jmeter 测试后如何保存结果集 http
  • VS2017 C# 默认程序集

    为了测试信号量类创建了示例 using System using System Threading class MyThread public Thread Thrd static Semaphore sem new Semaphore 2
  • 如何停止在图库小部件中滚动?

    我将一些图像加载到图库中 现在我可以滚动 但一旦开始滚动 滚动就不会停止 我希望图库滚动到下一张图像 然后停止 直到用户再次执行滚动手势 这是我的代码 import android widget ImageView import andro
  • 将唯一整数id分配给字符串的最有效方法?

    我编写的程序处理大量对象 每个对象都有自己唯一的id 它本身就是一个结构复杂 对象的数十个唯一字段通过一些分隔符连接起来 且长度很大的字符串 由于我必须快速处理很多这些对象 并且在处理时需要通过 id 引用它们 并且我无权更改它们的格式 我
  • 通过 JSR-223 执行动态 Java 代码

    我已经在我的应用程序中通过 JSR 223 执行动态代码有一段时间了 基本逻辑是 ScriptEngineManager scriptEngineManager new ScriptEngineManager ScriptEngine sc
  • 过去 24 小时内最流行的 PHP MySQL 查询

    假设我想获得过去 24 小时内点赞最多的 10 条记录 这是我到目前为止所拥有的 date date o m d query SELECT date created COUNT to from to FROM likes WHERE dat
  • Java 使用标签打印机打印到特定页面尺寸

    我正在尝试使用标签打印机 具体来说是EPSON TM T88V 来吐出PNG图像 我可以让它打印得很好 除了当我打印图像尺寸 再次具体说明为 72dpi 时为 220x175 时 打印的图像顶部有一团空白 我认为这是浪费纸张 关于如何最大限
  • 将照片上传到 Facebook:在执行 newUploadPhotoRequest 调用之前添加参数会出现“OAuthException”错误

    摘要 尝试在 Facebook 上发布图像和描述 如果图像 URL 为空 我将使用本地可绘制的默认图像上传到照片 要上传本地图像 我使用以下代码 My code Request Callback uploadPhotoRequestCall
  • 带有受保护设置器的最小起订量属性

    我想要最小起订量下一个对象 abstract class Foo public string Bar get protected set so that new Mock
  • 压缩为 png 时位图颜色发生变化

    我目前正在开发一个隐写 Android 应用程序作为一个班级项目 我创建了一个对象 它将在另一个图像中对图像进行编码并返回编码的位图 该代码在单独的线程中运行 new Thread new Runnable public void run