标签: bitmapfactory

经常切换ImageView位图时,BitmapFactory.Options.inBitmap会导致撕裂

我遇到过一种情况,我必须以幻灯片形式显示图像,以便快速切换图像.大量的图像使我想要将JPEG数据存储在内存中,并在我想要显示它们时解码它们.为了简化垃圾收集器,我使用BitmapFactory.Options.inBitmap来重用位图.

不幸的是,这导致相当严重的撕裂,我尝试了不同的解决方案,如同步,信号量,2-3个位图之间的交替,但是,似乎没有解决问题.

我已经建立了一个示例项目,在GitHub上演示了这个问题; https://github.com/Berglund/android-tearing-example

我有一个线程解码位图,在UI线程上设置它,并睡眠5毫秒:

Runnable runnable = new Runnable() {
@Override
public void run() {
        while(true) {
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inSampleSize = 1;

            if(bitmap != null) {
                options.inBitmap = bitmap;
            }

            bitmap = BitmapFactory.decodeResource(getResources(), images.get(position), options);

            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    imageView.setImageBitmap(bitmap);
                }
            });

            try {
                Thread.sleep(5);
            } catch (InterruptedException e) {}

            position++;
            if(position >= images.size())
                position = 0;
        }
    }
};
Thread t = new Thread(runnable);
t.start();
Run Code Online (Sandbox Code Playgroud)

我的想法是ImageView.setImageBitmap(Bitmap)在下一个vsync上绘制位图,但是,当发生这种情况时,我们可能已经解码了下一个位图,因此,我们已经开始修改位图像素.我在想正确的方向吗?

有谁有任何关于从哪里去的提示?

android bitmap tearing bitmapfactory

13
推荐指数
2
解决办法
4734
查看次数

如何在Android编码中的ImageView上编写文本?

嗨,我一直在尝试在Imageview上编写Numbers.N个问题的图像.如果用户输入的答案是正确的,那么它应该显示带有刻度标记图像的问题编号,否则带有错误标记图像的问题编号.我需要在图像上写下问号.我的代码在这里:

    LinearLayout l_layout = (LinearLayout) findViewById(R.id.linear_view_report);
    LayoutParams param = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, 1.0f);
    ImageView[] imgview=new ImageView[questions.length];
    for(int i=0;i<no_of_questions;i++)
    {
                if(userEnteredAnswers[i]==correct_answer[i]){           
                    Bitmap bm=BitmapFactory.decodeResource(getResources(),R.drawable.correct);
                    Canvas canvas = new Canvas(bm);
                    Paint paint = new Paint(); 
                    paint.setColor(Color.BLACK); 
                    paint.setTextSize(10); 
                    canvas.drawText(i, 5, 5, paint);

                    imgview[i]=new ImageView(this);
                    imgview[i].setImageDrawable(new BitmapDrawable(bm));
                    l_layout.addView(imgview[i]);
                }
                else {          
                    Bitmap bm=BitmapFactory.decodeResource(getResources(),R.drawable.wrong);
                    Canvas canvas = new Canvas(bm);
                    Paint paint = new Paint(); 
                    paint.setColor(Color.BLACK); 
                    paint.setTextSize(10); 
                    canvas.drawText(i, 5, 5, paint);

                    imgview[i]=new ImageView(this);
                    imgview[i].setImageDrawable(new BitmapDrawable(bm));
                    l_layout.addView(imgview[i]);
                }       
            }
Run Code Online (Sandbox Code Playgroud)

我收到这个警告:

The constructor BitmapDrawable(Bitmap) is deprecated
Run Code Online (Sandbox Code Playgroud)

图像未在运行时显示.我究竟做错了什么?

java android imageview bitmapfactory

12
推荐指数
1
解决办法
2万
查看次数

如何使用BitmapFactory.decode*()指定位图格式(例如RGBA_8888)?

我在做多次打电话给BitmapFactory.decodeFile()BitmapFactory.decodeResource(),和我想指定位图解码的格式,如RGB_565或RGBA_8888.

目前,解码的位图格式似乎取决于输入图像.或者,有没有办法将现有位图转换为特定格式?

这很重要的原因是当我尝试使用jnigraphics图像解码图像时,一些图像会返回一种AndroidBitmapFormat类型ANDROID_BITMAP_FORMAT_NONE,我认为这种图像是无用的.有没有人更深入地了解为什么格式不是已知值?发生这种情况时,内置图像选择器会正确显示以这种方式解码的图像,因此我认为必须有一种方法来处理它们.

感谢您的输入!

android bitmapfactory

11
推荐指数
1
解决办法
1万
查看次数

获取Bitmap Android的大小

可能重复:
解码后的位图字节大小?

反正所以我可以得到这个Bitmap的大小?我试过使用getByteCount()但我不能使用它?

Bitmap bitmap = BitmapFactory.decodeByteArray(decryptedData , 0, decryptedData .length);    //decoding bytearrayoutputstream to bitmap
Run Code Online (Sandbox Code Playgroud)

有什么建议?

size android get bitmap bitmapfactory

11
推荐指数
1
解决办法
4万
查看次数

Android:我应该使用哪种图像格式?为什么?

我是一个初学者程序员,我的问题是:我的Android应用程序将使用哪种图像格式?

Descripton:我只使用插图,因此图像主要是背景图像和一些按钮,我想知道哪种方法最好.

我目前的图像进展是下一个:我使用.png文件格式.我不知道我应该使用什么分辨率,现在我使用300x400 px图像aproximetly.

这是我使用图像的代码:

Bitmap bMap = BitmapFactory.decodeResource(getResources(), MyArray[index].getArtiD());

MyImageView.setImageBitmap(bMap);

所以这就是我在Android中使用图像的方式,如果有人知道问题,提示或"必须知道的信息",请告诉我们这样做.我真的不明白为什么我应该使用这个位图工厂或为什么我应该使用png格式.我想以最好的方式做到这一点,我在Android文档中看不到很多东西.

谢谢,亚当

android android-image bitmapfactory

11
推荐指数
1
解决办法
2万
查看次数

BitmapFactory意外地下采样图像

在我的Android应用程序中,我上传并下载JPEG图像.对于某些图像BitmapFactory下采样下载的图像,我不明白为什么以及如何阻止它这样做.我上传和下载图像时记录Bitmap对象大小:

Uploading image with size 3840x2160 Opening received image of size 2601584B degradation 0 decoded 384x216

所以这里我的图像宽度和高度在解码后除以10 BitmapFactory.对于另一个图像,我从3480x4640到217x290,因此除以16.我首先想到它可能是由图像dpi元数据引起的,所以我尝试使用以下代码打开图像时强制它:

BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inSampleSize = 1 << degradation;
opts.inScaled = false;
opts.inDensity = 1;
opts.inTargetDensity = 1;
opts.inScreenDensity = 1;
final Bitmap original = BitmapFactory.decodeByteArray(data, 0, data.length, opts);
Log.d(Tags.IMAGES, "Opening received image of size " + data.length + " degradation " + degradation + " decoded " + original.getWidth() + "x" + original.getHeight());
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我给出的字节数(2MB)BitmapFactory与没有300x200px图像的大图像一致.所以我的上传代码和下载代码是正确的我在解码之前有正确的数据.

我强制所有密度以避免缩放并禁用缩放,我的样本大小为1,因为我的降级为0所以我不强制进行任何子采样.我仍然以一个非常小的图像结束.并 …

android bitmapfactory android-bitmap

11
推荐指数
1
解决办法
204
查看次数

android - calculateInSampleSize,为什么当宽度>高度时Math.round处理高度(高度/ reqHeight)?

我正在'developer.android.com'上缩小我的位图文件,我发现了一件我不理解的事情.所以我感谢你给我一点帮助.

这是developer.android.com 的一个片段

public static int calculateInSampleSize(
        BitmapFactory.Options options, int reqWidth, int reqHeight) {
  // Raw height and width of image
  final int height = options.outHeight;
  final int width = options.outWidth;
  int inSampleSize = 1;

  if (height > reqHeight || width > reqWidth) {
    if (width > height) {
      inSampleSize = Math.round((float)height / (float)reqHeight);
    } else {
      inSampleSize = Math.round((float)width / (float)reqWidth);
    }
  }
  return inSampleSize;
}
Run Code Online (Sandbox Code Playgroud)

在if语句中,当"if(width> height)"为什么会计算"(float)height /(float)reqHeight"?

例如,width = 600,height = 800,reqWidth = 100,reqHeight = 100. …

android bitmapfactory

10
推荐指数
1
解决办法
5191
查看次数

MediaStyle LargeIcon的大小

我正在使用新的Notification.MediaStyle类为FTP流媒体音乐播放器应用程序实现Lollipop风格的通知.我将专辑封面设为我的"大图标".

鉴于专辑封面直接取自当前正在播放的文件,此专辑封面的大小取决于来源(可能高达5000x5000).

从我的棒棒糖前代码中,我在以下定义的最大大小下解码位图: android.R.dimen.notification_large_icon_width

android.R.dimen.notification_large_icon_height

这适用于解码时间更快,内存使用是理想的.

但是,当此代码应用于我的MediaStyle样式时,展开的视图使用比尺寸参数定义的图标大得多的图标,从而在展开时产生模糊的专辑封面.

是否有一些常量来定义MediaStyle大图标的展开视图的最大大小?或者这个问题有一些解决方法吗?就目前而言,以全分辨率解码艺术是不可接受的,因为它可能导致应用程序因OOM而崩溃.

android android-notifications bitmapfactory android-bitmap

10
推荐指数
1
解决办法
934
查看次数

使用gridview显示SDCard上特定文件夹的图像

我正在尝试创建一个gridview,它载有来自SDCard上的特定文件夹的图像.该文件夹的路径是已知的,("/ sdcard/pictures"),但在我在网上看到的示例中,我不确定如何或在何处指定图片文件夹的路径,我想从中加载图像.我已经阅读了几十个教程,甚至是developer.android.com上的HelloGridView教程,但这些教程并没有教会我正在寻找什么.

我到目前为止阅读的每个教程都有:

A)从/ res文件夹中将图像称为Drawable,并将它们放入要加载的数组中,而不是使用SDCard.

B)使用MediaStore 访问SDCard上的所有图片,但未指定如何设置我想要显示图像表单的文件夹的路径

要么

C)建议使用BitmapFactory,我没有丝毫的线索如何使用.

如果我以错误的方式解决这个问题,请告诉我,并指导我采取正确的方法来做我想做的事情.

android gridview uri android-sdcard bitmapfactory

9
推荐指数
2
解决办法
3万
查看次数

Android:PNG透明度失败BitmapFactory.decodeStream(...)和资产文件夹

我使用以下方法从我的Android应用程序中的assets文件夹中提取PNG文件:

public static Bitmap getBitmapFromAssets(Context context, String fileName) {
        try {
            AssetManager assetManager = context.getAssets();
            InputStream inputStream = assetManager.open(fileName);
            Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
            return bitmap;
        }
        catch(Exception ex) {
            ex.printStackTrace();
            return null;
        }
    }
Run Code Online (Sandbox Code Playgroud)

然后我在GridView的项目中将ImageView的源设置为该Bitmap.

这是有问题的布局XML:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/containingLayout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:gravity="center_horizontal"
    android:background="@android:color/transparent"
    android:padding="0dp"
    android:layout_margin="0dp"
>
    <ImageView
        android:id="@+id/ivPackageIcon"
        style="@style/smLargeGridItemPackageIconStyle"
    />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

该XML中提到的样式是:

<style name="smLargeGridItemPackageIconStyle">
        <item name="android:scaleType">fitXY</item>
        <item name="android:layout_width">100dp</item>
        <item name="android:layout_height">142dp</item>
        <item name="android:layout_margin">5dp</item>
        <item name="android:background">@android:color/transparent</item>
    </style>
Run Code Online (Sandbox Code Playgroud)

以下是设置ImageView源代码:

ImageView ivPackageIcon = (ImageView)containingView.findViewById(R.id.ivPackageIcon);
        if(ivPackageIcon != null) {
            Bitmap coverImage = getBitmapFromAssets(containingView.getContext(), "myimage.png"); …
Run Code Online (Sandbox Code Playgroud)

png transparency android transparent bitmapfactory

9
推荐指数
1
解决办法
3762
查看次数