如何只显示位图的一部分 -

时间:2012-03-15 13:31:31

标签: android graphics bitmap scale

我试图创造一个移动的背景。我的目标是让一个巨大的位图单独滚动,使它看起来好像在移动。但首先我需要弄清楚如何只显示位图的一部分。香港专业教育学院尝试过此代码,但一直没有成功。这个子集是我在这种情况下寻找的吗? canvas.drawBitmap(bitmap, """subset"""src, dst, paint)

这是方法说明 bitmap要绘制的位图====== src可能为null。要绘制的位图的子集======= dst位图将缩放/转换为适合

的矩形

4 个答案:

答案 0 :(得分:9)

Canvas.drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint);

它允许我们指定要绘制的位图的部分 通过第二个参数。 Rect类保存左上角和右下角 矩形的坐标。当我们通过src指定Bitmap的一部分时,我们就这样做了 在Bitmap的坐标系中。如果我们指定null,将使用完整的Bitmap。 第三个参数定义应该绘制位图部分的位置, 再次以Rect实例的形式。  这次角落坐标是在Canvas目标的坐标系中给出的(View或其他Bitmap)。 令人惊讶的是,这两个矩形的大小不一定相同。如果我们指定 目标矩形的大小小于源矩形,然后是Canvas 会自动为我们扩展。指定更大的目的地也是如此 矩形。

Rect dst = new Rect();
dst.set(50, 50, 350, 350);
canvas.drawBitmap(bmp, null, dst, null);

这里bmp是一个原始大小为160 * 183像素的位图。使用Rect。将其缩放为250 * 250像素。

答案 1 :(得分:1)

使用裁剪图像做其他事情的其他方法

public class CropImageManipulator
{

    public CropImageManipulator()
    {
    }

    private string _fileNameWithoutExtension;
    private string _fileExtension;
    private string _fileDirectory;

    public void Cropping(string inputImgPath, int cropWidth, int cropHeight)
    {
        this._fileNameWithoutExtension = System.IO.Path.GetFileNameWithoutExtension(inputImgPath);
        this._fileExtension = System.IO.Path.GetExtension(inputImgPath);
        this._fileDirectory = System.IO.Path.GetDirectoryName(inputImgPath);

        //Load the image divided
         Image inputImg = Image.FromFile(inputImgPath);
        int imgWidth = inputImg.Width;
        int imgHeight = inputImg.Height;

        //Divide how many small blocks
        int widthCount = (int)Math.Ceiling((imgWidth * 1.00) / (cropWidth * 1.00));
        int heightCount = (int)Math.Ceiling((imgHeight * 1.00) / (cropHeight * 1.00));
        ArrayList areaList = new ArrayList();

        int i = 0;
        for (int iHeight = 0; iHeight < heightCount ; iHeight ++)
        {
            for (int iWidth = 0; iWidth < widthCount ; iWidth ++)
            {
                int pointX = iWidth * cropWidth;
                int pointY = iHeight * cropHeight;
                int areaWidth = ((pointX + cropWidth) > imgWidth) ? (imgWidth - pointX) : cropWidth;
                int areaHeight = ((pointY + cropHeight) > imgHeight) ? (imgHeight - pointY) : cropHeight;
                string s = string.Format("{0};{1};{2};{3}",pointX,pointY,areaWidth,areaHeight);

                Rectangle rect = new Rectangle(pointX,pointY,areaWidth,areaHeight);
                areaList.Add(rect);
                i ++;
            }
        }

        for (int iLoop = 0 ; iLoop < areaList.Count ; iLoop ++)
        {
            Rectangle rect = (Rectangle)areaList[iLoop];
            string fileName = this._fileDirectory + "\\" + this._fileNameWithoutExtension + "_" + iLoop.ToString() + this._fileExtension;
            Bitmap newBmp = new Bitmap(rect.Width,rect.Height,PixelFormat.Format24bppRgb);
            Graphics newBmpGraphics = Graphics.FromImage(newBmp);
            newBmpGraphics.DrawImage(inputImg,new Rectangle(0,0,rect.Width,rect.Height),rect,GraphicsUnit.Pixel);
            newBmpGraphics.Save();
            switch (this._fileExtension.ToLower())
            {
                case ".jpg":
                case ".jpeg":
                    newBmp.Save(fileName,ImageFormat.Jpeg);
                    break;
                case "gif":
                    newBmp.Save(fileName,ImageFormat.Gif);
                    break;
            }
        }
        inputImg.Dispose();
    }
}

答案 2 :(得分:0)

您可以对ImageView进行子类化并使用getImageMatrix()来获取与该ImageView关联的Matrix对象,然后使用matrix.preTranslate()和matrix.preScale()告诉矩阵移动和/或缩放图像。以有效的方式创建滚动效果。完成后,您可以调用imageView.setImageMatrix(matrix),然后调用imageView.invalidate(),以使imageview更新其内容。

答案 3 :(得分:-1)

源sourceBitmap应该适当地准备,即过滤和缩放,例如适当的密度等等。 然后你必须定义一个抓住一个部分的矩形。说:

int desiredX0Lcl=50,
    desiredY0Lcl=70,
    desiredX1Lcl=400,
    desiredY1Lcl=500;   
Rect sourceRectLcl= new Rect();
sourceRectLcl.set(desiredX0Lcl,desiredY0Lcl,desiredX1Lcl,desiredY1Lcl);

现在创建一个目标矩形,其边界与sourceBitmap的所需部分匹配:

Rect destinationRectLcl=new Rect(); int widthLcl=desiredX1Lcl-desiredX0Lcl; int heightLcl=desiredY1Lcl-desiredY0Lcl; destinationRectLcl.set(0,0,widthLcl,heightLcl);

创建destinationCanvas:

Bitmap baseCanvasBitmapLcl = Bitmap.createBitmap(widthLcl,heightLcl ,Bitmap.Config.ARGB_8888); Canvas destCanvasLcl = new Canvas(baseCanvasBitmapLcl);

并绘制sourceBitmap的所需部分:

destCanvasLcl.drawBitmap(sourceBitmap,sourceRectLcl,destinationRectLcl,null); //sourceBitmap.recycle;