Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用实际像素绘制图像_Android_Image Processing_Canvas - Fatal编程技术网

Android 使用实际像素绘制图像

Android 使用实际像素绘制图像,android,image-processing,canvas,Android,Image Processing,Canvas,我的目标是在资源图像的顶部绘制 因此,我从我的资源中加载图像: bm = BitmapFactory.decodeResource(getResources(), R.drawable.image).copy(Bitmap.Config.ARGB_8888, true); 我知道这不是最好的方法,因为它会导致记忆问题,但现在我不担心了。。。 然后,我创建一个画布并在其上绘制 Canvas canv = new Canvas(bm); canv.drawLine(0, 10, 50, 70, p

我的目标是在资源图像的顶部绘制

因此,我从我的资源中加载图像:

bm = BitmapFactory.decodeResource(getResources(), R.drawable.image).copy(Bitmap.Config.ARGB_8888, true);
我知道这不是最好的方法,因为它会导致记忆问题,但现在我不担心了。。。 然后,我创建一个画布并在其上绘制

Canvas canv = new Canvas(bm);
canv.drawLine(0, 10, 50, 70, paint);
然后我将位图导出到一个文件中

现在,问题是:

  • 我用来画线的坐标不是原始图像的像素
  • 如果我在不同的设备、不同的屏幕上运行应用程序,生成的图像会不同(该行的位置和大小不同)
是否有方法指定原始图像像素的坐标w.r.t.或在不同设备中获得相同图像结果的方法


谢谢

你所面临的行为是因为Android的密度概念。这意味着当您从R.drawable.id创建位图时,它会根据设备密度缩放图像。 机制大致如下:

  • 检查设备密度并为此id选择最合适的可绘制:从可绘制hdpi/mdpi/../default。如果将图像放入不同的文件夹(hdpi、mdpi等),则每个设备上的大小都会不同
  • 如果没有合适的可绘制设备(例如,您在/drawable/文件夹中只提供了一个,但在/drawable hpi(etc)/)中没有提供)-它将使用此默认可绘制设备,但会根据设备密度和“默认密度”对其进行缩放
  • 您可以在此处查看详细信息:

    但是,如果您在所有设备上都需要相同的位图分辨率,我可以建议两种方法:

    1) 不要将图像放在drawable/文件夹中,而是放在一个:/drawable-nodpi中。这将阻止它扩展,并将拒绝Android根据设备密度进行调整

    2) 您可以尝试以下方法:

    InputStream is = getResources().openRawResource(imageId);
    originalBitmap = BitmapFactory.decodeStream(is); 
    
    通过这种方式,您可以避免Android密度缩放系统,并获得与/drawable/文件夹中资源大小完全相同的位图


    如果需要更多的细节,请告诉我。祝你好运

    你所面临的行为是因为Android的密度概念。这意味着当您从R.drawable.id创建位图时,它会根据设备密度缩放图像。 机制大致如下:

  • 检查设备密度并为此id选择最合适的可绘制:从可绘制hdpi/mdpi/../default。如果将图像放入不同的文件夹(hdpi、mdpi等),则每个设备上的大小都会不同
  • 如果没有合适的可绘制设备(例如,您在/drawable/文件夹中只提供了一个,但在/drawable hpi(etc)/)中没有提供)-它将使用此默认可绘制设备,但会根据设备密度和“默认密度”对其进行缩放
  • 您可以在此处查看详细信息:

    但是,如果您在所有设备上都需要相同的位图分辨率,我可以建议两种方法:

    1) 不要将图像放在drawable/文件夹中,而是放在一个:/drawable-nodpi中。这将阻止它扩展,并将拒绝Android根据设备密度进行调整

    2) 您可以尝试以下方法:

    InputStream is = getResources().openRawResource(imageId);
    originalBitmap = BitmapFactory.decodeStream(is); 
    
    通过这种方式,您可以避免Android密度缩放系统,并获得与/drawable/文件夹中资源大小完全相同的位图


    如果需要更多的细节,请告诉我。祝您好运

    我相信这可能是因为您正在将位图放入
    res/drawable
    文件夹。根据您运行应用程序的设备,位图的分辨率将发生变化,因此不会按需要绘制线条

    您可以通过将位图放置在“资源”文件夹中并按如下方式加载来修复此问题:

    public Bitmap readBitmapFromMemory(String filename) {
            Bitmap defautBitmap = null;
            File filePath = this.getFileStreamPath(filename);
            FileInputStream fi;
            try {
                fi = new FileInputStream(filePath);
                defautBitmap = BitmapFactory.decodeStream(fi);
    
            } 
            catch (FileNotFoundException e) {
                e.printStackTrace();
    
            }
    
            return defautBitmap;
    
        }
    

    我希望这有帮助。

    我相信这可能是因为您正在将位图放入
    res/drawable
    文件夹。根据您运行应用程序的设备,位图的分辨率将发生变化,因此不会按需要绘制线条

    您可以通过将位图放置在“资源”文件夹中并按如下方式加载来修复此问题:

    public Bitmap readBitmapFromMemory(String filename) {
            Bitmap defautBitmap = null;
            File filePath = this.getFileStreamPath(filename);
            FileInputStream fi;
            try {
                fi = new FileInputStream(filePath);
                defautBitmap = BitmapFactory.decodeStream(fi);
    
            } 
            catch (FileNotFoundException e) {
                e.printStackTrace();
    
            }
    
            return defautBitmap;
    
        }
    

    我希望这有帮助。

    太完美了!非常感谢你!你能推荐这两种方法中的任何一种吗?很乐意帮忙:)我想,实际上这两种方法都很好。但是如果你要使用第二个,一定要把文件放在默认的“drawable”文件夹中。因为如果您将其置于“drawables mdpi”(例如),代码可能会在hdpi/xhdpi设备上崩溃,因为android不支持“升级”,并且可以说“无资源”。非常完美!非常感谢你!你能推荐这两种方法中的任何一种吗?很乐意帮忙:)我想,实际上这两种方法都很好。但是如果你要使用第二个,一定要把文件放在默认的“drawable”文件夹中。因为如果您将其置于“drawables mdpi”(例如),代码可能会在hdpi/xhdpi设备上崩溃,因为android不支持“升级”,并且可以说“无资源”。