Как показать только часть растрового изображения-- - PullRequest
6 голосов
/ 15 марта 2012

Я пытаюсь создать задний план.Моя цель состоит в том, чтобы иметь огромную растровую прокрутку, чтобы она выглядела так, как будто она движется.но сначала мне нужно выяснить, как показать только часть растрового изображения.Я пробовал этот код, но безуспешно.Подмножество, что я ищу в этой ситуации?canvas.drawBitmap(bitmap, """subset"""src, dst, paint)

Это растровое изображение объяснения метода Растровое изображение, которое нужно нарисовать ====== src Может быть нулевым.Подмножество растрового изображения, которое будет отображено

Ответы [ 4 ]

9 голосов
/ 15 марта 2012
Canvas.drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint);

Это позволяет нам указать часть растрового изображения для рисования через второй параметр.Класс Rect содержит координаты верхнего левого и нижнего правого углов прямоугольника.Когда мы указываем часть растрового изображения через src, мы делаем это в системе координат растрового изображения.Если мы укажем ноль, будет использован полный битмап.Третий параметр определяет, куда должна быть нарисована часть растрового изображения, снова в форме экземпляра Rect.На этот раз угловые координаты задаются в системе координат цели Canvas (либо View, либо другое растровое изображение).Большим сюрпризом является то, что два прямоугольника не обязательно должны быть одинакового размера.Если мы укажем, что целевой прямоугольник будет меньше по размеру, чем исходный, то холст автоматически масштабируется для нас.То же самое верно для указания большего целевого прямоугольника.

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

здесь bmp - это растровое изображение с исходным размером 160 * 183 пикселей.Он масштабируется до 250 * 250 пикселей, используя Rect.

1 голос
/ 15 марта 2012

и другой способ сделать это, используя кадрированное изображение

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();
    }
}
0 голосов
/ 18 февраля 2017

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

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

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

0 голосов
/ 15 марта 2012

Вы можете создать подкласс ImageView и использовать getImageMatrix (), чтобы получить объект Matrix, связанный с этим ImageView, а затем указать матрице перемещать и / или масштабировать изображение, используя matrix.preTranslate () и matrix.preScale ()это создает эффект прокрутки эффективным способом.И когда вы закончите, вы можете вызвать imageView.setImageMatrix (matrix), а затем imageView.invalidate (), чтобы viewview обновил свой контент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...