Почему мое изображение не масштабируется правильно? - PullRequest
1 голос
/ 13 июня 2011

Я пытаюсь настроить масштаб изображения до определенного размера в зависимости от размера по горизонтали, отправляемого в функцию обновления, но следующий код, похоже, не правильно масштабирует изображение.

РЕДАКТИРОВАТЬ: код:

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;
    }

}

Результат. (синий прямоугольник является ограничительной рамкой предполагаемого размера изображения)

В какой части я ошибаюсь?

РЕДАКТИРОВАТЬ 2: Вот очки: glasses

РЕДАКТИРОВАТЬ 3: Из любопытства я запустил его на своем реальном телефоне и получил сильно отличающийся результат , изображение было растянуто за пределы предполагаемой синей рамки.

РЕДАКТИРОВАТЬ 4: Я попытался запустить приложение на нескольких эмуляторах, чтобы увидеть, было ли это несовместимостью с версией Android, но все они, казалось, работали отлично. Проблема масштабирования возникает только на моем телефоне (Vibrant, root, CM7) и моей кузине (Droid, также root). Это единственные физические устройства, на которых я тестировал, но у них, похоже, одна и та же проблема. Я был бы очень признателен, если бы кто-то смог мне здесь помочь, это огромное препятствие в моем проекте, и никакие другие форумы или группы сообщений не отвечают.

РЕДАКТИРОВАТЬ 5: Следует отметить, что в обновлении 4 код немного изменился, что, как я уже говорил, исправило проблему в эмуляторах, но не работает на физических устройствах. Изменения обновляются в коде выше. * отчаянно нуждаются в помощи *: P

РЕДАКТИРОВАТЬ 6: Еще одно обновление, я протестировал тот же код на моем старом G1, и он работает отлично, как и ожидалось. У меня сейчас нет абсолютно никакой подсказки.

Ответы [ 3 ]

1 голос
/ 20 июня 2011

Вы использовали каталог / res / drawable-nodpi / для хранения своих изображений?

Очевидно, если вы используете папки / drawable-ldpi /, / drawable-mdpi / или / drawable-hdpi /Android будет применять масштабирование к изображению при загрузке в зависимости от устройства.Причина, по которой ваш G1 может работать, заключается в том, что он может не требовать какого-либо масштабирования в зависимости от используемой вами папки.

Кроме того, ваши ссылки IMGUR не работают ... также ваш код не выглядит правильным ... вы звонитеDrawGlasses без аргументов.

0 голосов
/ 20 июня 2011

Нашел что не так. Изображение должно быть в папке с именем drawable-nodpi, иначе оно будет масштабировано в зависимости от DPI.

0 голосов
/ 13 июня 2011
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);  
...