【问题标题】:android image serialization transparent pngandroid图像序列化透明png
【发布时间】:2015-09-09 08:49:52
【问题描述】:

作为 .net 开发人员,刚接触 android,我正在尝试使用来自我的 asmx webservice 的图像。图像在数据库中保存为nvarchar (bytearray),所以我的 web 服务返回一个可以转换为位图的字符串。这一切都很好,但我在尝试获取带有透明部分的 png 图像时遇到了问题。无论我尝试什么,透明部分总是白色的。问题是,我在这里可能做错了几件事......

这是我将 png 写入 db (c#) 的方式(可能是我已经在这里失去了透明度?):

    Image toAdd = Image.FromFile(@"I:\Andoid\h1graph.png");

    string imagestring =  System.Convert.ToBase64String(imageToByteArray(toAdd));

这就是我在我的 android 应用上使用它的方式:

    Bitmap bmp;

    androidHttpTransport.call(SOAP_ACTION, envelope);

    SoapPrimitive resultsRequestSOAP = (SoapPrimitive) envelope.getResponse();

    String result = resultsRequestSOAP.toString();

    if (!result.equals("")) {

                 byte[] bloc = Base64.decode(result, Base64.DEFAULT);

                 bmp = BitmapFactory.decodeByteArray(bloc, 0, bloc.length);

                 bmp.setHasAlpha(true);

                 ByteArrayOutputStream os = new ByteArrayOutputStream();

                 bmp.compress(Bitmap.CompressFormat.PNG,  100,  os);

                 byte[] bloc2 = os.toByteArray();

                 Bitmap bPNGCompress =  BitmapFactory.decodeByteArray(bloc2, 0, bloc2.length);

                 viewModel.setThreeD(bPNGCompress) ;

    }

我已经剥离了代码,所以只有基本代码在那里。所以,这行得通,但它不能保持透明度。

我猜,这是因为BitmapFactory.DecodeByteArray 创建了一个不透明的位图,所以其余的转换代码不会创建透明。

我现在苦苦挣扎了好几天,试图找到解决方案,但我似乎没有找到。必须有从 web 服务使用 png 图像的最佳实践,序列化为字符串 (?)。

使用资源中的 png,在透明的情况下可以正常工作,所以我知道我的 png 是透明的,并且我的 UI 控件正常。 (我知道编码不是最先进的,但为了避免复制粘贴各种方法,我替换了一些通常在方法中的代码,以使其更具可读性)

我刚开始一个项目,正在尝试使用 android,所以如果有人对如何将图像导入我的应用程序有完全不同的想法,请随时发表想法。

【问题讨论】:

    标签: android image serialization png transparent


    【解决方案1】:

    为解码操作尝试显式 alpha 配置:

    BitmapFactory.Options opts = new BitmapFactory.Options(); opts.inPreferredConfig = Bitmap.Config.ARGB_8888;

    //然后使用显式的 alpha 选项调用 decodeByteArray:

    bmp = BitmapFactory.decodeByteArray(bloc, 0, bloc.length, opts);

    //然后对压缩的bmp版本应用相同的选项:

    Bitmap bPNGCompress = BitmapFactory.decodeByteArray(bloc2, 0, bloc2.length);

    更新 我编写了一个简单的测试应用程序来测试代码,它可以正常工作(即具有透明度)。 在处理图像之前丢失了 100% 的 ALPHA 位。

    占位符布局:

    <ImageView android:background="#FF0000" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imageView" android:layout_marginTop="135dp" />

    代码: ImageView imageView = (ImageView) findViewById(R.id.imageView);

        byte[] imgData = Base64.decode("iVBORw0KGgoAAAANSUhEUgAAAJIAAACSCAMAAACZpWO8AAAC0FBMVEWioqKioqKioqKioqKioqKioqKmpqaurq6urq6tra2urq6urq6lpaWkpKSurq6urq6urq6lpaWurq6urq6urq6urq6lpaWurq6pqamurq6urq6urq6urq6urq6oqKiurq6tra2urq6urq6rq6uurq6mpqaurq6urq6urq6urq6urq6urq6urq6np6eurq6kpKSjo6Opqamurq6urq6urq6urq6urq6urq6urq6ioqKkpKSpqamurq6urq6urq6urq6qqqqurq6urq6urq6srKyurq6mpqaurq6urq6urq6urq6tra2lpaWurq6urq6urq6urq6urq6urq6urq6urq6oqKiurq6oqKiurq6lpaWurq6urq6np6eurq6urq6urq6urq6urq6urq6urq6pqamurq6urq6urq6urq6srKyurq6urq6jo6Ourq6urq6urq6urq6urq6oqKioqKinp6eqqqqnp6eurq6urq6urq6pqamurq6urq6urq6urq6rq6uqqqqkpKSurq6urq6np6eurq6urq6urq6urq6jo6Ourq6urq6urq6urq6lpaWurq6urq6qqqqurq6urq6urq6urq6urq6jo6OkpKSurq6urq6urq6urq6srKympqaurq6urq6rq6uioqKurq6urq6urq6srKyjo6Ourq6urq6kpKSkpKSurq6urq6srKyurq6np6eurq6urq6lpaWurq6urq6urq6urq6mpqampqalpaWurq6pqamurq6urq6urq6urq6kpKSkpKSjo6Ourq6urq6urq6jo6Ourq6urq6urq6urq6np6erq6uurq6urq6mpqaurq6urq6urq6urq6urq6urq6urq6jo6Ourq6urq6urq6urq6urq6urq6urq6urq6qqqqjo6Ourq6jo6MAAACmpqaoqKiqqqqsrKyjo6Otra2np6erq6upqamurq5SThJGAAAA5nRSTlP7/v79/PzQhSihZ1zY5kqVkd6WPYCe3Yy5Y0AvPo3AJ6NEWayH0jgukGA1N4rMMuTyvUF2fW0kNnr54rucg0V3tSkxWKtW10NXXl2i3Ihql1JQkpt/xprBTuFihs4qLA4IFmxfvItmOXSmc2vznZgmeY/CxcmzzY5aYb5LZQob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", Base64.DEFAULT);
        Bitmap bmp = BitmapFactory.decodeByteArray(imgData, 0, imgData.length);
    
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        bmp.compress(Bitmap.CompressFormat.PNG, 100, os);
    
        byte[] compressedData = os.toByteArray();
    
        Bitmap bPNGCompress =  BitmapFactory.decodeByteArray(compressedData, 0, compressedData.length);
    
        imageView.setImageBitmap(bPNGCompress);`
    

    【讨论】:

    • 感谢您的想法,但它没有任何区别......仍然没有透明度。我正在.net中编写一个测试应用程序,以检查当我将它作为字符串添加到数据库时透明度是否丢失,或者问题是否出在我在我的android应用程序中使用字符串的代码中。希望这能让我知道在哪里看。
    • 是的,这是正确的 - 您丢失了 ALPHA(透明度)位。我测试了上面的代码,它运行良好(答案也更新了)。
    • 非常感谢马库斯!现在我知道去哪里找了。您是如何创建图像字符串的,这也可能对我有所帮助。
    • 不客气。从 Firefox 或 Chrome - 开发者工具 - 网络选项卡 - 右键单击​​图像资源并选择复制图像作为数据 URI/复制响应
    • 好的,所以剩下要做的就是弄清楚如何从 png 中创建一个字符串,以保持 .net 中的透明度(无法想象这会很困难)再次感谢很多马库斯!
    猜你喜欢
    • 2018-10-09
    • 2012-02-26
    • 2011-05-31
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    • 2016-03-05
    • 2013-03-17
    相关资源
    最近更新 更多