标签: android-bitmap

试图缩小Android中的Bitmap无法正常工作

我正在尝试缩小位图.简而言之,图像最初来自宽度为4016的ByteArray.在使用工厂选项缩小图像后,它仍会报告宽度为4016的图像.

这是我的代码的两个剪辑:

Bitmap myBitmap = null;
        @Override
        protected byte[] doInBackground(Object... params) {


            final BitmapFactory.Options options = new BitmapFactory.Options();
            options.inJustDecodeBounds = true;

            if (options.outHeight > options.outWidth) {
                options.inSampleSize = calculateInSampleSize(options, 640, 960);
            } else {
                options.inSampleSize = calculateInSampleSize(options, 960, 640);
            }

            options.inJustDecodeBounds = false;

            //myImageByteArray is 4016 wide
            myBitmap = BitmapFactory.decodeByteArray(myImageByteArray, 0, myImageByteArray.length, options);

            //This log statement outputs 4016!!! Shouldn't it be smaller since I just decoded the byteArray with options?
            Log.d("bitmap", myBitmap.getWidth()+"");

}

        public int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int …
Run Code Online (Sandbox Code Playgroud)

java android bitmap android-bitmap

8
推荐指数
1
解决办法
3012
查看次数

HPROF之后我的应用程序中的巨大字节[]

有时,特别是在我的应用程序中实现新功能时,我使用DDMS + HPROF来分析内存和堆使用.由于应用程序似乎没有任何性能 - ANR问题,一切顺利,最初我并不关心它 - 但现在,因为我看到它几乎总是相同的大小,我想知道该死的是什么是.

每次运行HPROF时,都会检查Leak suspects选项卡.总有一个android.graphics.Bitmap实例占用了所有已用堆的大约25%.

泄漏嫌疑人

我想进一步了解那是什么,所以我打开了支配树,看到了这个:

支配树

所以基本上有一个巨大的byte[]实例保留了大量的堆,并且从未被释放.根据这个,我复制了byte[]它的值,将它转储到一个.data文件中,用Gimp打开,结果如下:

PNG

所以基本上,它看起来像PNG图像的"alpha(0)"部分.考虑以下事实:

  • 我的所有图像文件都是<8K
  • 其中只有一些是PNG - 剩下的我能够转换为JPG,我做到了
  • 没问题,如果我添加更多图像,其大小byte[]始终与应用程序的开始大致相同(4个月前)
  • 为了调试它,我试图从和文件夹中删除任何图像文件并运行应用程序没有任何可绘制的资源,并且仍然存在drawabledrawable-xxxbyte[]
  • 我删除了几乎所有的布局,只让基本的功能,同样的结果
  • Dominator树中,根类是android.graphics.Bitmap

任何人都知道它是什么byte[]以及我是否应该做任何事情来解放它?

任何帮助赞赏!

android memory-leaks hprof ddms android-bitmap

8
推荐指数
1
解决办法
1521
查看次数

为什么Bitmap在android中显示黑色背景

我写了一些代码,可以将tablelayout转换为bitmap.everythink工作完美但是,我的位图有黑色背景这是我的源代码

public Bitmap sendMyData(TableLayout view) {

    Bitmap bitmap = null;

    ByteArrayOutputStream bbb = new ByteArrayOutputStream();
    view.setDrawingCacheEnabled(true);
    view.layout(0, 0, view.getWidth(), view.getHeight());
    view.buildDrawingCache(true);
    bitmap = Bitmap.createBitmap(view.getDrawingCache());
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bbb);
    view.setDrawingCacheEnabled(false);

    return bitmap;

}
Run Code Online (Sandbox Code Playgroud)

我的代码出了什么问题?为什么我的位图有黑色背景?如果有人知道解决方案,请帮助我谢谢

android android-layout android-canvas android-bitmap

8
推荐指数
2
解决办法
6728
查看次数

在某些情况下,在Android上将图像扭曲为四边形会失败

我正在使用matrix.setPolyToPoly函数将位图的选定区域(4个角)转换为矩形,通常它工作得很棒.但在下一个例子中:

4角选择图像

polyToPoly函数未通过透视变换:

转换图像不好

我画了两行进行测试,这些线标记了我想要四个选定点的位置.

我做错了什么?谢谢!

编辑:我已经使用canvas.drawBitmapMesh解决了问题,感谢pskink的建议!!

这是最终的代码

private float[] generateVertices(int widthBitmap, int heightBitmap) {
    float[] vertices=new float[(WIDTH_BLOCK+1)*(HEIGHT_BLOCK+1)*2];

    float widthBlock = (float)widthBitmap/WIDTH_BLOCK;
    float heightBlock = (float)heightBitmap/HEIGHT_BLOCK;

    for(int i=0;i<=HEIGHT_BLOCK;i++)
        for(int j=0;j<=WIDTH_BLOCK;j++) {
            vertices[i * ((HEIGHT_BLOCK+1)*2) + (j*2)] = j * widthBlock;
            vertices[i * ((HEIGHT_BLOCK+1)*2) + (j*2)+1] = i * heightBlock;
        }
    return vertices;
}

private Bitmap perspectiveTransformation(Bitmap bitmap, ArrayList<Point> bitmapPoints) {

    Bitmap correctedBitmap;
    int maxX = (int) Math.max(Math.abs(bitmapPoints.get(0).x - bitmapPoints.get(1).x), Math.abs(bitmapPoints.get(2).x - bitmapPoints.get(3).x));
    int maxY = (int) Math.max(Math.abs(bitmapPoints.get(0).y - bitmapPoints.get(3).y), …
Run Code Online (Sandbox Code Playgroud)

android matrix perspective android-bitmap

8
推荐指数
1
解决办法
538
查看次数

为什么setImageBitmap对自定义ImageButton没有影响?

我找到了这个链接,说明我如何在我的身上发光效果ImageButton.因此,只要用户按下ImageButtononTouchEvent()功能被称为有我所说的setImageBitmap()功能.问题是这个函数(setImageBitmap())似乎根本没有效果.

什么有效:

1)到目前为止,我扩展ImageButton如下

// Pen.java
public class Pen extends ImageButton {
    public Pen(Context context, AttributeSet attrs) {
        super(context, attrs);  
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        System.out.println("Now I am setting  Pen");
        return true;
    }


}
Run Code Online (Sandbox Code Playgroud)

然后在Activity I中创建Pen(自定义ImageButton)实例,从实例定义setGlow()和调用.setImageBitmap()Pen

//MainActivity.java

public class MainActivity extends Activity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Pen myImgbutton; 
        myImgbutton = (Pen) findViewById(R.id.pen); …
Run Code Online (Sandbox Code Playgroud)

android bitmap bitmapimage android-drawable android-bitmap

8
推荐指数
3
解决办法
380
查看次数

Android:从文件中旋转并显示图像

我有一个非常简单的布局与ImageView.我的应用程序打开相机,保存图像,然后在ImageView中显示图像BitmapFactory.decodeFile.唯一的问题是它是旋转的.我理解a)这是由于手机的相机默认为横向,所以这需要在代码中处理,b)图像处理必须在与UI的单独线程中完成.

Android培训文档似乎适用于从资源ID而不是文件路径加载图像.这只会让事情变得棘手,因为我能够按照教程进行操作,但最终难以协调差异.

我当然是新手,所以如果有人能够给我一个高层次的概述,为了实现这个目标需要做些什么,我真的很感激.以下代码是我正在将位图添加到ImageView的位置.我假设我对单独线程的调用会进入onCreate

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_display_image);

    Bitmap bm = BitmapFactory.decodeFile(MainActivity.image_path);

    displayImageView = (ImageView) findViewById(R.id.myImageView);

    displayImageView.setImageBitmap(bm);
}
Run Code Online (Sandbox Code Playgroud)

java android android-bitmap

7
推荐指数
1
解决办法
9227
查看次数

Android PNG到Bitmap --- SkImageDecoder :: Factory返回null

我正在尝试从我的Environment.getExternalStorageDirectory()加载屏幕截图并尝试将其转换为位图

 public void onPictureTaken(String path) throws IOException {

    String photoPath = filepath + "/" + path;; //UPDATE WITH YOUR OWN JPG FILE

    File directory = new File (filepath);
    File file = new File(directory, path);

    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(photoPath, options);

    // Calculate inSampleSize
    options.inSampleSize = 4;
    options.inJustDecodeBounds = false;
    BitmapFactory.decodeFile(photoPath, options);

}
Run Code Online (Sandbox Code Playgroud)

--- SkImageDecoder :: Factory返回null

这是我调用onPictureTaken的函数:

 private void observeSceenshot(){
    filepath = Environment.getExternalStorageDirectory()
            + File.separator + Environment.DIRECTORY_PICTURES
            + File.separator + "Screenshots";
    Log.d(TAG, filepath);

    FileObserver fileObserver …
Run Code Online (Sandbox Code Playgroud)

android bitmap bitmapfactory android-bitmap

7
推荐指数
1
解决办法
1915
查看次数

RecyclerView和异步加载

我有一个小问题.需要朝着正确的方向轻推.我正在做像Vine和/或Instagram的视频编辑器.他们在视频中显示带有屏幕截图的时间线 在此输入图像描述

它只是根据视频持续时间添加更多图片.我为我的应用程序做的是我添加了recyclerView.此recyclerview有一个适配器,每次在onBindViewHolder上调用以下函数

  public Bitmap getFrameFromCurrentVideo(int seconds) {
    Bitmap bitmap = null;
    if(mMediaMetadataRetriever != null) {
      bitmap = mMediaMetadataRetriever.getFrameAtTime(seconds * 1000000, MediaMetadataRetriever.OPTION_CLOSEST);
    }
    return bitmap;
  }
Run Code Online (Sandbox Code Playgroud)

这是有效的,它添加了我想要的适当数量的图像.但问题是它在UI线程上太沉重了.由于recyclerView回收所有东西.它每次必须得到一个帧时就会滞后.

所以我认为我必须做一些异步任务,然后缓存图像.但我读到的是,AsyncTask不建议用于回收站视图,因为它可以循环使用.

那么我应该怎样做才能提高性能呢?有什么好主意吗?

android android-asynctask android-bitmap

7
推荐指数
1
解决办法
6476
查看次数

以原始形式保存图像且不压缩

我想保存图像而不压缩它,并希望以原始形式保存它,即当图像被压缩时,图像尺寸会减小并且图像变小。我为此目的使用本机相机。我正在工作android studio。我正在制作一个应用程序,在其中使用相机来保存图像。但图像经过压缩,非常小,质量也很低。

下面是我保存图像的代码

 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    final LocationSettingsStates states = LocationSettingsStates.fromIntent(data);
    if(requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE)
    {
        if(resultCode == Activity.RESULT_OK)
        {
            Bitmap bmp = (Bitmap)data.getExtras().get("data");
            ByteArrayOutputStream stream = new ByteArrayOutputStream();

            bmp.compress(Bitmap.CompressFormat.JPEG, 100, stream);
            byte[] byteArray = stream.toByteArray();

            // convert byte array to Bitmap
            Bitmap bitmap = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);

            if(isStoragePermissionGranted())
            {
                SaveImage(bitmap);
            }


        }
    }else {
        switch (requestCode) {
            case 1000:
                switch (resultCode) {
                    case Activity.RESULT_OK:
                        // All required changes were successfully made …
Run Code Online (Sandbox Code Playgroud)

android image android-camera android-bitmap

7
推荐指数
1
解决办法
8798
查看次数

权限拒绝:打开提供程序 com.miui.gallery.provider.GalleryOpenProvider

java.lang.SecurityException:权限拒绝:从 ProcessRecord{932688f 12849:mobi.hubbler.app/u0a158} (pid=12849,uid=10158) 打开未从 uid 10034 导出的提供程序 com.miui.gallery.provider.GalleryOpenProvider

    InputStream is = null;
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    is = context.getContentResolver().openInputStream(bitmapUri);
    BitmapFactory.decodeStream(is, null, options); 
Run Code Online (Sandbox Code Playgroud)

尝试从 uri 获取位图。此问题仅发生在 MI(小米)设备上。

android inputstream android-bitmap xiaomi

7
推荐指数
1
解决办法
4074
查看次数