我使用BitmapFactory.decodeFile解码来自SD卡的位图。 有时位图比应用程序需要的或者堆允许的大,所以我使用BitmapFactory.Options.inSampleSize来请求二次采样(较小)的位图。 问题是平台没有强制执行inSampleSize的确切值,而且有时候我得到的位图太小了,或者对于可用内存来说太大了。 从http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html#inSampleSize : 注意:解码器将尝试完成这个请求,但是由此产生的位图可能有不同的尺寸,正是所要求的。 另外,2的幂次对于解码器来说通常更快/更容易兑现。 我应该如何解码从SD卡的位图获得我需要的确切大小的位图,而尽可能less的内存来解码它? 编辑: 当前源代码: BitmapFactory.Options bounds = new BitmapFactory.Options(); this.bounds.inJustDecodeBounds = true; BitmapFactory.decodeFile(filePath, bounds); if (bounds.outWidth == -1) { // TODO: Error } int width = bounds.outWidth; int height = bounds.outHeight; boolean withinBounds = width <= maxWidth && height <= maxHeight; if (!withinBounds) { int newWidth = calculateNewWidth(int width, […]
对于我的10,000点,我已经决定与这个酷酷的网站相提并论:一种机制来caching本地内存上的位图。 背景 Android设备的每个应用程序的内存数量非常有限 – 堆栈范围从16MB到128MB,具体取决于各种参数 。 如果你通过这个限制,你会得到OOM,这在使用位图的时候会发生很多次。 很多时候,一个应用程序可能需要克服这些限制,在庞大的位图上执行繁重的操作,或者只是将它们存储起来供以后使用,而且您需要 我想到的是一个简单的java类,它可以使事情变得更容易。 它使用JNI来存储位图数据,并能够在需要时进行恢复。 为了支持这个类的多个实例,我不得不使用我发现的一个技巧( 这里 )。 重要笔记 数据仍然存储在RAM中,所以如果设备没有足够的RAM,应用程序可能会被终止。 请记住尽快释放内存。 这不仅是为了避免内存泄漏,而且也是为了避免系统优先被杀死,一旦你的应用程序进入后台。 如果不想忘记释放内存,则可以在每次还原位图时释放它,或者使类实现可closures 。 作为一个安全措施,我已经使它在finalize()方法中自动释放它的本地内存,但是不要让它对这个工作负责。 这太危险了。 当这种事情发生的时候,我也把它写入日志。 它的工作方式是将整个数据复制到JNI对象中,为了恢复,它从头开始创build位图并将数据放入其中。 正在使用和恢复的位图是ARGB_8888格式。 当然,你可以改变它到任何你想要的,只是不要忘记改变代码… 大的位图可能需要一些时间来存储和恢复,所以在后台线程上执行它可能是明智的。 这不是一个完整的OOM解决scheme,但它可以帮助。 例如,您可以将其与您自己的LruCache一起使用,同时避免将caching本身用于堆内存。 代码仅用于存储和恢复。 如果你需要执行一些操作,你将需要进行一些研究。 openCV可能是答案,但如果你想执行一些基本的东西,你可以自己实现它们( 这里是一个使用JNI旋转大图片的例子 )。 如果你知道其他的select,请在这里告诉我。 希望这对一些人有用。 请写下您的意见。 另外,如果您发现代码有任何问题或意见不清,请告诉我。 解决scheme更好 如果你想在JNI方面执行更多的操作,你可以使用我所做的这篇文章 。 它基于我在这里编写的代码,但允许您执行更多操作,并且可以轻松添加更多自己的代码。
序幕 这个问题不时在这里popup来,但通常是因为写得不好而被删除。 我看到很多这样的问题,然后在请求附加信息时,从OP (通常的低代表)沉默。 有时候,如果input对我来说足够好,我决定回答一个答案,通常在活动时每天得到一些赞成票,但几个星期后问题就会被删除/删除,一切从头开始。 所以我决定写这个问答,所以我可以直接参考这些问题,而不必一遍又一遍地重写答案。 另一个原因是这个META线程针对我,所以如果你有额外的input随时发表评论。 题 如何使用C ++将位图图像转换为ASCII艺术 ? 一些限制: 灰度图像 使用单间隔字体 保持简单(不要为初学者级程序员使用太高级的东西) 这是一个相关的Wiki页面ASCII艺术 (感谢@RogerRowland)
如何将位图图像转换为Drawable? 谢谢,Farha
我有一个位图: Bitmap bitmap = BitmapFactory.decodeFile("some/arbitrary/path/image.jpg"); 但是我不打算把图像显示给用户。 我想alpha是100(255)。 如果这是不可能的,我可以设置Bitmap的不透明度吗?
我有C#中的BitmapImage。 我需要对图像进行操作。 例如灰度,在图像上添加文字等 我已经find了函数在灰度计算接受位图并返回位图的计算器。 所以我需要将BitmapImage转换为位图,做操作并转换回来。 我该怎么做? 这是最好的方法吗?
我想在SQLite DataBase存储图像。 我试图存储它使用BLOB和String ,在这两种情况下,它存储图像,可以检索它,但是当我把它转换为Bitmap使用BitmapFactory.decodeByteArray(…)它返回null。 我已经使用这个代码,但是它返回null Bitmap bitmap = BitmapFactory.decodeByteArray(blob, 0, blob.length);
我有一堆图片url。 我必须下载这些图像并逐个显示在我的应用程序中。 我使用SoftReferences和Sdcard将图像保存在一个集合中,以避免重读和改善用户体验。 问题是我不知道有关位图的大小。 事实certificate,当我使用BitmapFactory.decodeStream(InputStream)方法时,我偶尔会发生OutOfMemoryException BitmapFactory.decodeStream(InputStream) 。 所以,我select使用BitmapFactory选项(sample size = 2)对图像进行缩减采样。 这给了更好的输出:没有OOM,但是这会影响较小图像的质量。 我应该如何处理这种情况? 有没有办法有select地降低采样高分辨率的图像?
我有一个RGB无符号字符的缓冲区,我想转换成一个位图文件,有没有人知道如何? 我的RGB浮动是以下格式 (0,0)],G [(0,0)],B [(0,0)],R [(0,1)],G [(0,1)],B [ 1)],R [(0,2)],G [(0,2)],B [(0,2)] ….. 每个数据单元的值范围从0到255.任何人有任何想法,我怎么能做这个转换?
据我可以告诉唯一的方法来从BitmapSource转换为位图是通过不安全的代码…像这样(来自Lesters WPF博客 ): myBitmapSource.CopyPixels(bits, stride, 0); unsafe { fixed (byte* pBits = bits) { IntPtr ptr = new IntPtr(pBits); System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap( width, height, stride, System.Drawing.Imaging.PixelFormat.Format32bppPArgb,ptr); return bitmap; } } 做相反的事情: System.Windows.Media.Imaging.BitmapSource bitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap( bitmap.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions()); 在框架中有一个更简单的方法吗? 那它不在的原因是什么(如果不是的话)? 我会认为这是相当有用的。 我需要它的原因是因为我使用AForge在WPF应用程序中执行某些图像操作。 WPF想要显示BitmapSource / ImageSource,但是AForge在位图上工作。