在Delphi中实现图片的旋转、缩放

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Delphi中实现图片的旋转、缩放相关的知识,希望对你有一定的参考价值。

参考技术A  好长时间没有写东西了 并不是因为前面的东西遭受了很多西红柿和鸡蛋 而是自己实在没有什么真实的东西写出来供大家参考 但是最近在帮一个朋友做一个项目的时候 遇到了在delphi中对图像的简单处理 于是不停的从网上找资料 翻看csdn以前的帖子 从我搜索的结果发现很多人会在各种项目中遇到类似的图片处理问题 但是多数得到的答案似乎并不完整(因为很多都没有结帖 也可能是个人习惯的问题 呵呵 希望大家读了我这个文章之后 能够家开结帖速度) 于是我把我遇到的问题和解决方案写在下面 供大家参考 同时欢迎大家继续拍砖

  在正式内容之前要把我要解决的问题写在前面 同时也让读者有一个好的定位 从而不会因为我在处理过程中的拙劣手段而感到恼火 这里主要解决的问题是在Delphi中将用扫描仪扫描得到的图片进行 度旋转 从而得到适合使用的图片 并且由于不能正确把握图片的大小 因此要对图片进行简单的缩放 而我的解决方法也完全是根据此要求进行 因为对于效率 图片处理之后的清晰度考虑的不是很多 同时带来的好处就是程序看起来很简单

  首先 我没有扫描仪 因此我不知道使用扫描程序(已经提供)得到的图片是什么格式 而在Delphi的帮助中说 A bitmap is a powerful graphics object used to create manipulate (scale scroll rotate and paint) and store images in memory and as files on a disk 所以我的第一步就是要把我的片转化为TBitmap来处理 在转化格式的同时 我将图片的实际大小改变 以适合后面选取部分图像的需要 函数如下

procedure TMainForm ChangeImageFormate;var Bitmap : TBitmap;Zoom : Integer;beginBitmap := TBitmap Create; // trywith ImageCert do beginBitmap Assign(Picture Graphic); // Picture := nil; // Zoom := Max(Bitmap Width div Width Bitmap Height div Height)+ ; // Width := Bitmap Width div Zoom; // Height := Bitmap Height div Zoom; // Canvas StretchDraw(Rect( Width Height) Bitmap); // end;finallyBitmap Free;end; end;

  我想这段代码并不是很复杂 ImageCert是一个TImage控件放在Form上 唯一可能陌生的就是第八句 但是大家可以从Delphi的帮助中得到很到说明 我在这就不再翻译了(我的建议就是多看帮助) 同时应该指出的是第三句作用是很关键的 如果去掉这一句同时你的图片格式不是bmp的话 就会出现 只有bitmap才能才能修改 的错误

  第二步就是实现图片的旋转 因为程序要求只是每次旋转 度即可 因此这里也比较容易处理 处理的手段就是按照像素进行替换 实现过程如下

procedure TMainForm RotateImage;var x y : Integer;TmpBitMap : TBitmap;beginTmpBitMap := TBitmap Create;tryTmpBitMap Assign(ImageCert Picture Graphic);with ImageCert do beginPicture Bitmap Height := TmpBitMap Width;Picture Bitmap Width := TmpBitMap Height;for x:= to Height dofor y:= to Width doCanvas Pixels[TmpBitMap Height x y] := TmpBitMap Canvas Pixels[y x];Height := TmpBitMap Width;Width := TmpBitMap Height;end;finallyTmpBitMap Free;end;end;

  这段程序也没有什么好讲的 但是几个高度和宽度的设置令我是分的烦闷 总是觉得多做的点什么 但是却偏偏去不掉任何一行 如果哪位有兴趣可以尝试一下 最好把结果也告诉我一声 而且在这个里面由于TImage和TBitmap都有各自的canvas 所以使用哪一个可能也是值得研究的 但是由于时间有限就没有在尝试了

  至于在部分取图的过程中 我是用了一个TShape 然后用将brush的style设置成bsclear 在ImageCert的onMouseMove中安排这个TShap的位置 这样做不是很灵敏 因为当鼠标在TShape上面时则不会起到作用 所幸影响不大 同时我在TShape的OnMouseDown事件中取出TShape下面的部分图片 这个时候如果你的图片没有做过缩放处理 就会发现取出的图片和我们看到的位置不相符(当然是在TImage没有正确显示图片大小的情况下)

  可以肯定这个方法不是很好的方法 但是至少它解决了问题

lishixinzhi/Article/program/Delphi/201311/24976

Unity中实现通过鼠标对物体进行旋转平移缩放

废话不多说,直接上代码 —— 将下面的代码赋给所需要控制的物体上即可。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MouseControlModel : MonoBehaviour
{
    //旋转最大角度
    public int yMinLimit = -20;
    public int yMaxLimit = 80;
    //旋转速度
    public float xSpeed = 250.0f;
    public float ySpeed = 120.0f;
    //旋转角度
    private float x = 0.0f;
    private float y = 0.0f;

    void Update()
    {
        if (Input.GetMouseButton(0))
        {
            //将屏幕坐标转化为世界坐标  ScreenToWorldPoint函数的z轴不能为0,不然返回摄像机的位置,而Input.mousePosition的z轴为0
            //z轴设成10的原因是摄像机坐标是(0,0,-10),而物体的坐标是(0,0,0),所以加上10,正好是转化后物体跟摄像机的距离
            Vector3 temp = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 10));
            transform.position = temp;
        }
        else if (Input.GetMouseButton(1))
        {
            //Input.GetAxis("MouseX")获取鼠标移动的X轴的距离
            x += Input.GetAxis("Mouse X") * xSpeed * 0.02f;
            y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;
            y = ClampAngle(y, yMinLimit, yMaxLimit);
            //欧拉角转化为四元数
            Quaternion rotation = Quaternion.Euler(y, x, 0);
            transform.rotation = rotation;
        }
        else if (Input.GetAxis("Mouse ScrollWheel") != 0)
        {
            //鼠标滚动滑轮 值就会变化
            if (Input.GetAxis("Mouse ScrollWheel") < 0)
            {
                //范围值限定
                if (Camera.main.fieldOfView <= 100)
                    Camera.main.fieldOfView += 2;
                if (Camera.main.orthographicSize <= 20)
                    Camera.main.orthographicSize += 0.5F;
            }
            //Zoom in  
            if (Input.GetAxis("Mouse ScrollWheel") > 0)
            {
                //范围值限定
                if (Camera.main.fieldOfView > 2)
                    Camera.main.fieldOfView -= 2;
                if (Camera.main.orthographicSize >= 1)
                    Camera.main.orthographicSize -= 0.5F;
            }
        }
    }

    //角度范围值限定
    static float ClampAngle(float angle, float min, float max)
    {
        if (angle < -360)
            angle += 360;
        if (angle > 360)
            angle -= 360;
        return Mathf.Clamp(angle, min, max);
    }
}

以上是关于在Delphi中实现图片的旋转、缩放的主要内容,如果未能解决你的问题,请参考以下文章

delphi 如何在delphi中实现托盘图标

请问如何在delphi中实现多选打印功能!

在delphi中实现控件的拖拽

TMsgThread, TCommThread -- 在delphi线程中实现消息循环(105篇博客,好多研究消息的文章)

在 Delphi 中实现 OAuth 提供程序

如何在自定义 delphi 组件中实现 stringlist 属性?