微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

笔记10: 变换图像


一、显示图形图像
对图像文件显示过程:
(1)创建Image类(如Bitmap)、Graphics烊的对象
(2)用Graphics.DrawImage绘制

图形文件格式:
Bmp 与存储设置和应用程序无关的图像。每位像素位数(1、4、8、15、24、32、64)在
文件头中指定。24位Bmp是通用的。
GIF Web通用格式。适用线、纯色、边界清晰图片。是无损压缩。可指定一色为透明。
JPEG 24位,有损压缩(肉眼难辨),不支持透明。
EXIF 数码相机照片格式,据JPEG压缩,还包括日期、曝光时间、相机等信息。
PNG 无损压缩(同GIF),以8、24、48位存储颜色,并以1、2、4、8、16位存储灰度
为每像素存储Alpha值。还可含Gamma及颜色校正,可精确显示图像。


TIFF 各平台及程序均支持,以每像素任意位存储图像,压缩算法多样。灵活性好


'01.DrawImage绘制图片文件
'   共有30个重载。从原始图上的一部分或全部   画到  目标上的某位置或区域
Imports System.Drawing
Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles Button1.Click
        Dim gr As Graphics = Me.CreateGraphics
        Dim bm As New Bitmap("D:\1.jpg")

        '指定位置画原始图的全部
        gr.DrawImage(bm,New Point(10,5))

        '指定位置区域画原始图(有缩放功能)
        gr.TranslateTransform(200,5)
        gr.DrawImage(bm,New Rectangle(0,80,80))

        '取原始图部分进行画(无缩放)
        gr.TranslateTransform(100,0)
        gr.DrawImage(bm,New RectangleF(0,30,60,60),GraphicsUnit.Pixel)

        '取原始图部分在目标上某区域绘制(缩放)
        gr.TranslateTransform(-280,150)
        gr.DrawImage(bm,100,110),GraphicsUnit.Pixel)
    End Sub
End Class







'02.Clone 克隆
'克隆受参数像素格式影响,成图不同
Imports System.Drawing
Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles Button1.Click
        Dim gr As Graphics = Me.CreateGraphics
        Dim bm As New Bitmap("D:\1.bmp")

        '原图
        gr.DrawImage(bm,5))

        Dim bm1 As Bitmap = bm.Clone(New Rectangle(0,40,50),Imaging.PixelFormat.Format24bppRgb)
        gr.TranslateTransform(180,5)
        gr.DrawImage(bm1,0) '为了看清clone不再缩放

        Dim bm2 As Bitmap = bm.Clone(New Rectangle(40,Imaging.PixelFormat.Format24bppRgb)
        gr.TranslateTransform(80,0)
        gr.DrawImage(bm2,0)

        '下面是像素不同时的展现
        Dim bm3 As Bitmap = bm.Clone(New Rectangle(40,Imaging.PixelFormat.Format16bppArgb1555)
        gr.TranslateTransform(-250,150)
        gr.DrawImage(bm3,0)

        Dim bm4 As Bitmap = bm.Clone(New Rectangle(40,Imaging.PixelFormat.Format4bppIndexed)
        gr.TranslateTransform(110,0)
        gr.DrawImage(bm4,0)

        Dim bm5 As Bitmap = bm.Clone(New Rectangle(40,Imaging.PixelFormat.Format1bppIndexed)
        gr.TranslateTransform(110,0)
        gr.DrawImage(bm5,0)

        Dim bm6 As Bitmap = bm.Clone(New Rectangle(40,Imaging.PixelFormat.Format8bppIndexed)
        gr.TranslateTransform(110,0)
        gr.DrawImage(bm6,0)
    End Sub
End Class







'03 MakeTransparent 使某色透明
'   先取得某颜色GetPixel,然后用maketransparent进行透明

Imports System.Drawing.drawing2d
Public Class Form1
    '为了便于查看,窗体背景设置为黄色
    Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles Button1.Click
        Dim gr As Graphics = Me.CreateGraphics
        '取色
        Dim bm As New Bitmap("D:\2.bmp")
        Dim col As Color = bm.GetPixel(1,1)

        '画原始图
        gr.DrawImage(bm,10,10)

        '透明
        bm.MakeTransparent(col)
        gr.DrawImage(bm,280,10)
        gr.DrawRectangle(Pens.Red,New Rectangle(280,bm.Width,bm.Height)) '原来的外框
    End Sub
End Class








'04 用ico图像绘制图形
'  先用ico构造TextureBrush,然后再构造Pen,最后画图形
Imports System.Drawing
Imports System.Drawing.drawing2d

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles Button1.Click
        Dim gr As Graphics = Me.CreateGraphics
        Dim bm As New Bitmap("d:\3.ico")

        Dim tb As New Drawing.TextureBrush(bm)
        Dim myPen As New Pen(tb,20)

        gr.DrawImage(bm,10)
        gr.DrawEllipse(myPen,New Rectangle(40,200,100))
    End Sub
End Class








二、图像变换

1、Image对象的RotateFlip方法可以旋转和翻转。
Rotate旋转, Flip翻转
须先用Image.FromFile(Str)等方法加载图像文件


'05.图像的旋转与翻转:Image.RotateFlip
'旋转都是顺时针


Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles Button1.Click
        Dim gr As Graphics = Me.CreateGraphics
        Dim img As Image = Image.FromFile("D:\5.jpg")

        gr.DrawImage(img,New Point(0,0))

        img.RotateFlip(RotateFlipType.Rotate90FlipNone) '2.顺时针转90
        gr.DrawImage(img,New Point(130,0))

        '每次变换都是从上一次变换
        img.RotateFlip(RotateFlipType.Rotate90FlipX) '3.先转90再X翻转
        gr.DrawImage(img,New Point(260,0))

        img.RotateFlip(RotateFlipType.Rotate90FlipY) ' 4.先转90再Y翻转
        gr.DrawImage(img,New Point(390,0))

        img.RotateFlip(RotateFlipType.RotateNoneFlipX) ' 5.X翻转
        gr.DrawImage(img,130))

        img.RotateFlip(RotateFlipType.RotateNoneFlipY) '6.Y翻转
        gr.DrawImage(img,130))

        img.Save("D:\11.bmp") '最后形变
    End Sub
End Class








'06.对图形的反射、扭曲
'关键在定义目标区域,目标区域由平行四边形定义(取三个点,第四点自动计算)
'三点:左上角、左下角,右上角。
Imports System.Drawing
Imports System.Drawing.drawing2d
Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles Button1.Click
        Dim bm As New Bitmap("D:\1.jpg")
        Dim gr As Graphics = Me.CreateGraphics

        Dim bm1 As New Bitmap(bm.Width,bm.Height)
        Dim gr1 As Graphics = Graphics.FromImage(bm1)
        
        Dim p As Point() = {New Point(100,0),New Point(200,50)}
        
        gr.DrawImage(bm,0)) '原图在窗体上

        '示意图:bm上有图,通过绘制(变形)到bm1(原先有空白,现在有图),最后显示在窗体上
        gr1.DrawImage(bm,p)  '先把bm变形画到bm1上(要注意bm1能容纳bm变形后的图形,例中专门不能容纳全部变形后图形)
        gr.DrawImage(bm1,150)) '再把bm1画上窗体上

        bm1.Save("D:\11.jpg") '变形图形存盘
    End Sub
End Class








'07.插值模式缩放 Graphics.InterPolationMode

Imports System.Drawing
Imports System.Drawing.drawing2d
Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles Button1.Click
        Dim gr As Graphics = Me.CreateGraphics
        Dim bm As New Bitmap("d:\1.jpg")
        Dim src As New Rectangle(0,bm.Height)
        Dim dec As New Rectangle(0,0.5 * bm.Width,0.5 * bm.Height)

        gr.DrawImage(bm,src,GraphicsUnit.Pixel) '原图

        gr.TranslateTransform(160,dec,GraphicsUnit.Pixel) '缺省

        gr.InterpolationMode = drawing2d.InterpolationMode.Bicubic
        gr.TranslateTransform(80,GraphicsUnit.Pixel)

        gr.InterpolationMode = drawing2d.InterpolationMode.High
        gr.TranslateTransform(80,GraphicsUnit.Pixel)

        gr.InterpolationMode = drawing2d.InterpolationMode.Low
        gr.TranslateTransform(80,GraphicsUnit.Pixel)
    End Sub
End Class









'08.纹理填充图形(如椭圆)
'主要用TextureBrush,并可对纹理缩放
Imports System.Drawing
Imports System.Drawing.drawing2d
Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles Button1.Click
        Dim gr As Graphics = Me.CreateGraphics
        Dim bm As New Bitmap("d:\1.jpg")
        Dim tBrush As New TextureBrush(bm)

        gr.FillEllipse(tBrush,300,150))

        tBrush.ScaleTransform(0.5F,0.5F) '可对纹理进行缩放等坐标变换
        gr.FillEllipse(tBrush,150,150))
    End Sub
End Class









'09.Graphics.BeginContainer 
'   Graphics.EndContainer
'图形容器:“装载”或“容纳”图形数据(包括坐标)的“容器”。比如窗口(0,0)就是认的容器。
'BeginContainer将保存先前的容器(数据到堆栈上,并设置标识),开始新的一容器。
'EndContainer 结束当前容器,并返回上一个beginContainer保存的数据。
'EndContainer之前可以有多个BeginContainer,但只能返回上一次容器数据(并移除堆栈上数据)
Imports System.Drawing
Imports System.Drawing.drawing2d
Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles Button1.Click
        Dim gr As Graphics = Me.CreateGraphics
        Dim grContainer As GraphicsContainer

        '定位,便于观看后面位置变化
        gr.DrawRectangle(Pens.Black,New Rectangle(50,50,50))

        gr.TranslateTransform(50,50) 'A
        grContainer = gr.BeginContainer '存储以前数据,开始创建容器

        gr.TranslateTransform(0,40)
        gr.FillRectangle(Brushes.Red,20,60))

        gr.EndContainer(grContainer) '恢复存储前容器,所以坐标返回到A处
        gr.FillRectangle(Brushes.Blue,20))
    End Sub
End Class







'10.EndContainer(gc)还原某状态前的容器
'   gr.restore 还原原始容器,删除堆栈上的信息
Imports System.Drawing.drawing2d
Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles Button1.Click
        Dim gr As Graphics = Me.CreateGraphics
        Dim gc1 As GraphicsContainer
        Dim gc2 As GraphicsContainer

        gc1 = gr.BeginContainer
        gr.TranslateTransform(50,50)
        gr.FillRectangle(Brushes.Blue,50))

        gc2 = gr.BeginContainer
        gr.TranslateTransform(50,50)
        gr.FillRectangle(Brushes.Red,60))

        gr.EndContainer(gc2)
        gr.FillRectangle(Brushes.Black,40))

        gr.EndContainer(gc1)
        gr.FillRectangle(Brushes.Red,30))
    End Sub
End Class

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强制返回为文本 -------------------------------- 数字类型的格式化 --------------------------------     固定格式参数:     General Number 普通数字,如可以用来去掉千位分隔号     format$("100,1
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办法, Format 或者FormatDateTime 竟然结果和系统设置的区域语言的日期和时间格式相关。意思是尽管你用诸如 Format(Now, "MM/dd/yyyy"),如果系统的设置格式区域语言的日期和时间格式分隔符是"-",那他还会显示为 MM-dd-yyyy     只有拼凑: <%response.write
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace My ‘全局错误处理,新的解决方案直接添加本ApplicationEvents.vb 到工程即可 ‘添加后还需要一个From用来显示错误。如果到这步还不会则需要先打好基础啦 ‘======================================================== ‘以下事件
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用的爽呀,这篇文章写与2011年,看来我以前没有认真去找这个方法呀。 https://blog.csdn.net/chzjxgd/article/details/6176325 金蝶K3 BOS的插件官方是用VB6编写的,如果  能用.Net下的语言工具开发BOS插件是一件很愉快的事情,其中缘由不言而喻,而本文则是个人首创,实现在了用V
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选中的单元格进行处理 Dim m As Range, tmpStr As String, s As String Dim x As Integer, y As Integer, subStr As String If MsgBox("确定要分列处理吗?请确定分列的数据会覆盖它后面的单元格!", _
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single) 2 Dim path As String, hash As String 3 For Each fil
  Imports MySql.Data.MySqlClient Public Class Form1 ‘ GLOBAL DECLARATIONS Dim conString As String = "Server=localhost;Database=net2;Uid=root;Pwd=123456;" Dim con As New MySqlConnection
‘導入命名空間 Imports ADODB Imports Microsoft.Office.Interop   Private Sub A1() Dim Sql As String Dim Cnn As New ADODB.Connection Dim Rs As New ADODB.Recordset Dim S As String   S = "Provider=OraOLEDB.Oracl
Imports System.IO Imports System.Threading Imports System.Diagnostics Public Class Form1 Dim A(254) As String    Function ping(ByVal IP As Integer) As String Dim IPAddress As String IPAddress = "10.0.
VB运行EXE程序,并等待其运行结束 参考:https://blog.csdn.net/useway/article/details/5494084 Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long Pr