Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.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
Java 裁剪位图而不首先读取整个位图_Java_Android_Bitmap_Crop - Fatal编程技术网

Java 裁剪位图而不首先读取整个位图

Java 裁剪位图而不首先读取整个位图,java,android,bitmap,crop,Java,Android,Bitmap,Crop,我有一个非常大的图像,我只想显示一个部分的大小显示(无缩放),该部分应该只是图像的中心。因为图像非常大,我无法将整个图像读入内存,然后进行裁剪。这是我到目前为止所拥有的,但它将为大图像提供OutOfMemory。另外,我不认为inSampleSize适用,因为我想裁剪图像,而不是降低分辨率 Uri data = getIntent().getData(); InputStream is = getContentResolver().openInputStream(data); Bitmap bi

我有一个非常大的图像,我只想显示一个部分的大小显示(无缩放),该部分应该只是图像的中心。因为图像非常大,我无法将整个图像读入内存,然后进行裁剪。这是我到目前为止所拥有的,但它将为大图像提供OutOfMemory。另外,我不认为inSampleSize适用,因为我想裁剪图像,而不是降低分辨率

Uri data = getIntent().getData();
InputStream is = getContentResolver().openInputStream(data);
Bitmap bitmap = BitmapFactory.decodeStream(is, null, null);

有什么帮助吗?

我想你是从错误的方向来处理这个问题的


如果位图已经太大,无法作为单个连续图像加载,为什么要将其存储为单个图像?将图像分块,然后加载中间的一个或多个图像块并对其进行操作。

我同意最简单的方法是将图像分割成许多较小的图像块,然后加载适当的图像块以生成您想要的图像

但是,如果您不想这样做,您可能会被迫研究jpeg本身的编码

您可以做的是将头从文件复制到一个新文件中,然后提取您想要的像素以创建一个新文件。然后,重新加载新文件将允许您只使用要处理的映像的子集,并且所有常规java功能和类将同样可供您使用


我知道它不一定是一个优雅或简单的解决方案,但它确实保证您能够使用预期能够使用的原始java功能。

您可以通过两个步骤来完成:

  • 使用inJustDecodeBounds=true获取位图的大小

  • 使用BitMapRegionCoder仅解码您想要解码的部分


  • 缺点是什么?它只适用于API 10(但它已经是大多数…。

    您的图像采用什么格式?jpeg。Grr-评论必须更长…是的。我不想把整个图像读入内存,只想把你放在中间的图像块读入内存。你有这方面的代码吗?@timothyjc:把它切成片?您可以在应用程序之外使用Imagemagick之类的工具来实现这一点。听起来对我的黑客技能来说太难了。我不得不放弃这个项目,因为其他一些技术限制:(这是一个好主意,但问题是,可能裁剪后的图像太大,可能会出现OOM。如果位图无法保存在堆中,则会导致OOM。如果您愿意,您可以检查需要多少,并避免OOM。此外,如果您有一个大位图,需要裁剪它并避免OOM,您可以使用JNI,就像我在这里所做的那样:I will absolutel你可以试试你的图书馆。thanls@SepehrBehroozi请注意,遗憾的是,我无法找到为什么我不能再将自己的回购协议导入Android Studio。如果成功,请在回购问题上发表