我在res/drawable-mdpi目录中有一个条目列表和一些位图文件.我正在尝试通过生成路径字符串并使用位图工厂来加载与从列表中选择的字符串值对应的图像.问题是我不认为我的路径是正确的,因为位图始终为空,即使对于默认图像也是如此.
String name = entries.get(position);
String img = "res/drawable/logo_" + name.toLowerCase() + ".png"; // create the file name
icon.setScaleType(ImageView.ScaleType.CENTER_CROP);
// check to see if the file exists
File file = new File(img);
if (file.exists()){
bm = BitmapFactory.decodeFile(img);
}
else{// use the default icon
bm = BitmapFactory.decodeFile("logo_default.png");
}
// set the image and text
icon.setImageBitmap(bm);
Run Code Online (Sandbox Code Playgroud)
res目录是否会被复制到设备上?我应该使用的正确路径是什么,或者我应该以不同的方式进行此操作?
谢谢
Mat b = new Mat();
Bitmap bmp = getIntent().getExtras().getParcelable("image_send");
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_display_image);
Mat tmp = new Mat (bmp.getWidth(), bmp.getHeight(), CvType.CV_8UC1);
Utils.bitmapToMat(bmp, tmp);
Imgproc.cvtColor(tmp, tmp, Imgproc.COLOR_RGB2GRAY);
//Imgproc.cvtColor(tmp, tmp, Imgproc.COLOR_GRAY2RGB, 4);
Utils.matToBitmap(tmp, bmp);
iv = (ImageView) findViewById(R.id.imageView1);
iv.setImageBitmap(bmp);
}
Run Code Online (Sandbox Code Playgroud)
无法显示bmp.我的应用程序在拍照后停止了.
维基百科给出了这个例子
Identifier Gender Bitmaps
F M
1 Female 1 0
2 Male 0 1
3 Male 0 1
4 Unspecified 0 0
5 Female 1 0
Run Code Online (Sandbox Code Playgroud)
但我不明白这一点.
Gender这里使用B树索引,我们将获得大量结果,例如,我们寻找Gender = Male,需要进一步过滤(因此不是很有用).Bitmap如何改善这种情况?我正在为Android做一个小游戏.当它在白色背景上工作时它工作顺利,但是当我想要放置背景图像时,它变得越来越慢.首先我尝试将其添加为布局背景图像,但它非常慢,动画是逐帧发生的.然后我决定在画布上绘制背景图像作为位图,结果比前一个稍微快一点,但与白色背景相比仍然没什么.
我试图多次缩放图像,我用更高的分辨率,更低的分辨率做到了,但结果没有改变,它仍然更慢.
所以我想问一下,有没有办法在没有失去应用程序的平滑性和速度的情况下为Android应用程序添加背景图像?
谢谢
PS:我在Sony Tablet S上尝试我的应用程序
我有一些关于Bitmap对象和内存及其一般分类的问题.
目标只是绘制一个位图,并在其顶部绘制消除位图底层区域的形状.
我创建了简单的概念证明代码,试图理解我应该如何去做.在这里的各种线程中,我发现了许多关于使用的提示:
android.graphics.PorterDuff.Mode.CLEAR
Run Code Online (Sandbox Code Playgroud)
下面的代码只是创建一个蓝色背景的屏幕,并添加自定义视图.此视图在其画布上绘制粉红色背景,位图图像(带有轻微边框以显示粉红色背景),黄色覆盖圆圈表示每个PorterDuffXfermode.
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuffXfermode;
import android.graphics.Paint.Style;
import android.graphics.PorterDuff.Mode;
import android.graphics.RectF;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.RelativeLayout;
public class Test extends Activity {
Drawing d = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
RelativeLayout.LayoutParams rlp = null;
// Create the view for the xfermode test
d = new Drawing(this);
rlp = new RelativeLayout.LayoutParams(600, 900);
rlp.addRule(RelativeLayout.CENTER_IN_PARENT);
d.setLayoutParams(rlp);
RelativeLayout rl = new RelativeLayout(this); …Run Code Online (Sandbox Code Playgroud) 我在磁盘上有一个图像文件,我正在调整文件大小并将其作为新的图像文件保存回磁盘.为了这个问题,我没有将它们带入内存以便在屏幕上显示它们,只是为了调整它们并重新保存它们.这一切都很好.但是,缩放后的图像上有如下所示的工件:android:运行时调整大小的图像质量
它们会因为这种失真而被保存,因为我可以将它们从磁盘上取下并在计算机上查看它们,但它们仍然存在同样的问题.
在将图像加载到Bitmap对象以将位图解码到内存时,我使用类似于此奇怪的内存不足问题的代码:
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(imageFilePathString, options);
int srcWidth = options.outWidth;
int srcHeight = options.outHeight;
int scale = 1;
while(srcWidth / 2 > desiredWidth){
srcWidth /= 2;
srcHeight /= 2;
scale *= 2;
}
options.inJustDecodeBounds = false;
options.inDither = false;
options.inSampleSize = scale;
Bitmap sampledSrcBitmap = BitmapFactory.decodeFile(imageFilePathString, options);
Run Code Online (Sandbox Code Playgroud)
然后我正在进行实际缩放:
Bitmap scaledBitmap = Bitmap.createScaledBitmap(sampledSrcBitmap, desiredWidth, desiredHeight, false);
Run Code Online (Sandbox Code Playgroud)
最后,新调整大小的图像将保存到磁盘:
FileOutputStream out = new FileOutputStream(newFilePathString);
scaledBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
Run Code Online (Sandbox Code Playgroud)
然后,正如我所提到的,如果我将该文件从磁盘中拉出来并查看它,它就会将质量问题链接到上面并且看起来很糟糕.如果我跳过createScaledBitmap并将samplesSrcBitmap直接保存回磁盘就没有问题,似乎只有在大小改变时才会发生.
我已经尝试过,正如您在代码中看到的那样,设置inDither为false,如http://groups.google.com/group/android-developers/browse_thread/thread/8b1abdbe881f9f71所述,并在上面的第一个链接帖子中提到.这并没有改变任何事情.另外,在我链接的第一篇文章中,罗曼盖伊说:
不要在绘图时调整大小(这将是非常昂贵的),尝试在屏幕外位图中调整大小并确保位图为32位(ARGB888). …
我正在创建一个需要将大图像解码为位图的应用程序,以便在ImageView中显示.
如果我只是尝试将它们直接解码为位图,我会收到以下错误"位图太大而无法上传到纹理中(1944x2592,max = 2048x2048)"
因此,为了能够使用以下方法显示分辨率过高的图像:
Bitmap bitmap = BitmapFactory.decodeFile(path);
if(bitmap.getHeight()>=2048||bitmap.getWidth()>=2048){
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int width = metrics.widthPixels;
int height = metrics.heightPixels;
bitmap =Bitmap.createScaledBitmap(bitmap, width, height, true);
}
Run Code Online (Sandbox Code Playgroud)
这有效,但我真的不想像现在的if语句那样对2048的最大值进行硬编码,但是我无法找到如何获得设备位图的最大允许大小
有任何想法吗?
我使用MapsForge 0.8在我的Android应用程序中显示地图.使用在线图块(只是位图而不是可以在运行时渲染器中调整的矢量数据)时,我的Hi分辨率设备上的地图非常小,我无法读取任何内容.
我想缩放地图,我尝试了以下内容:
mapView.getModel().displayModel.setDefaultUserScaleFactor(2.0f);
Run Code Online (Sandbox Code Playgroud)
和:
mapView.getModel().displayModel.setUserScaleFactor(2.0f);
Run Code Online (Sandbox Code Playgroud)
但它没有改变任何东西.
如何让它显示更大的地图?
更新:
我并不是指放大.我的意思是缩放当前的缩放级别,使其在高分辨率设备上可读.想象一下在一个小型智能手机上面的截图 - 它很小.我甚至无法阅读街道名称.