我试图创造一个移动的背景。我的目标是让一个巨大的位图单独滚动,使它看起来好像在移动。但首先我需要弄清楚如何只显示位图的一部分。香港专业教育学院尝试过此代码,但一直没有成功。这个子集是我在这种情况下寻找的吗? canvas.drawBitmap(bitmap, """subset"""src, dst, paint)
这是方法说明 bitmap要绘制的位图====== src可能为null。要绘制的位图的子集======= dst位图将缩放/转换为适合
的矩形答案 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;