我正在尝试将图像缩放到一定大小,具体取决于发送到更新功能的水平尺寸,但以下代码似乎无法正确调整图像大小。
编辑:代码:
public class GlassesView extends View {
private Paint paint;
private BitmapFactory.Options options;
private Bitmap bitmapOrg;
private Bitmap target;
private Bitmap bitmapRev;
private Bitmap resizedBitmap;
private int currY;
public int glassesX;
public int glassesY;
public float glassesSizeX;
public float glassesSizeY;
private boolean drawGlasses;
private boolean glassesMirrored;
public GlassesView(Context context) {
super(context);
paint = new Paint();
paint.setDither(false);
paint.setAntiAlias(false);
options = new BitmapFactory.Options();
options.inDither = false;
options.inScaled = false;
bitmapOrg = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(),
R.drawable.micro_glasses, options), 32, 5, false);
bitmapRev = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(),
R.drawable.glasses_reverse, options), 32, 5, false);
drawGlasses = false;
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawBitmap(target, 0, 0, paint);
boolean moving = currY < glassesY;
if (moving) {
currY++;
}
if (drawGlasses) {
int newWidth = resizedBitmap.getWidth();
int newHeight = resizedBitmap.getHeight();
Paint bluey = new Paint();
bluey.setColor(Color.argb(64, 0, 0, 255));
canvas.drawRect(new Rect(glassesX, currY, glassesX + newWidth,
currY + newHeight), bluey);
canvas.drawBitmap(resizedBitmap, glassesX, currY, paint);
}
if (moving) {
invalidate();
}
}
public void drawGlasses(int x1, int x2, int y, boolean mirror) {
drawGlasses = true;
glassesMirrored = mirror;
if (!mirror) {
glassesSizeX = (float) (x2 - x1) / (float) (25 - 16);
glassesSizeY = glassesSizeX;
glassesY = y - (int)(1*glassesSizeX);
glassesX = (int) (x1 - (glassesSizeX * 16));
} else {
glassesSizeX = (float) (x1 - x2) / (float) (25 - 16);
glassesSizeY = glassesSizeX;
glassesY = y - (int)(1*glassesSizeX);
glassesX = (int) (x1 - (glassesSizeX * 16));
}
currY = -1;
if (!glassesMirrored) {
resizedBitmap = Bitmap.createScaledBitmap(bitmapOrg,
(int) (bitmapOrg.getWidth() * glassesSizeX),
(int) (bitmapOrg.getHeight() * glassesSizeY), false);
} else {
resizedBitmap = Bitmap.createScaledBitmap(bitmapRev,
(int) (bitmapRev.getWidth() * glassesSizeX),
(int) (bitmapRev.getHeight() * glassesSizeY), false);
}
}
public void setTargetPic(Bitmap targetPic) {
target = targetPic;
}
}
The result.(蓝色矩形是图像预期大小的边界框)
我错了哪一部分?
编辑2:
以下是眼镜:
编辑3: 出于好奇,我在我的实际手机上运行它,得到much different result,图像被拉伸通过预定的蓝框。
编辑4: 我尝试在一些模拟器上运行应用程序,看看它是否是Android版本不兼容的东西,但它们似乎都运行得很好。缩放问题只发生在我的手机上(充满活力,有根,CM7)和我的堂兄(Droid,也有根)。这些是我测试过的唯一物理设备,但它们似乎都有相同的问题。 如果有人可以帮助我,我真的很感激,这是我项目中的一个巨大障碍,没有其他论坛或消息组响应。
编辑5: 我应该提一下,在更新4中,代码改变了一点,这解决了我所说的模拟器中的问题,但是在物理设备上不起作用。更改将在上面的代码中更新。 *急需帮助* :P
编辑6: 还有另一个更新,我在我的旧G1上测试了相同的代码,它按预期完美地工作。我现在完全没有头绪。
答案 0 :(得分:1)
您是否使用/ res / drawable-nodpi /目录存储图像?
显然,如果您使用/ drawable-ldpi /,/ drawable-mdpi /或/ drawable-hdpi /文件夹,Android会根据设备加载时对图像应用缩放。 G1可能起作用的原因是它可能不需要任何缩放,具体取决于您使用的文件夹。
此外,您的IMGUR链接已损坏...您的代码似乎也不正确...您调用没有参数的DrawGlasses。
答案 1 :(得分:0)
Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0, glassesWidth,
glassesHeight, matrix, false);
将最后一个参数从false更改为true。 你可以尝试一下。
以下是我按比例使用放大方法:
private void small() {
int bmpWidth=bmp.getWidth();
int bmpHeight=bmp.getHeight();
Log.i(TAG, "bmpWidth = " + bmpWidth + ", bmpHeight = " + bmpHeight);
/* 设置图片缩小的比例 */
double scale=0.8;
/* 计算出这次要缩小的比例 */
scaleWidth=(float) (scaleWidth*scale);
scaleHeight=(float) (scaleHeight*scale);
/* 产生reSize后的Bitmap对象 */
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
Bitmap resizeBmp = Bitmap.createBitmap(bmp,0,0,bmpWidth,
bmpHeight,matrix,true);
答案 2 :(得分:0)
发现了什么问题。图像必须位于名为“drawable-nodpi”的文件夹中,否则将根据DPI进行缩放。