• 大小: 5KB
    文件类型: .cs
    金币: 1
    下载: 0 次
    发布日期: 2021-06-05
  • 语言: C#
  • 标签: C#  tif转jpg  

资源简介

一般直接将tif转成jpg会造成图片变暗或者色彩差异较大,主要是因为直接线性拉伸导致了,这里我使用C#加gdal,将tif影像先进行百分比截断拉伸,再转jpg,效果直接类似于在arcgis中截图。另外,这个类中因为使用了gdal,所以如果直接用的话,还需要你的VS中引用gdal的类库,但最主要的是,我想介绍这个C# 百分比截断拉伸的算法

资源截图

代码片段和文件信息

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using OSGeo.GDAL;
using OSGeo.OSR;

namespace ImgProcess
{
    class TifToJpg
    {
        public void ConvertToJpg(string tifPath string jpgPath)
        {
            //gdal读取影像
            Dataset imgDatasat = Gdal.Open(tifPath Access.GA_ReadOnly);
            int bandCount = imgDatasat.RasterCount;
            int XSize = imgDatasat.RasterXSize;
            int YSize = imgDatasat.RasterYSize;
            Band[] bandArray = new Band[bandCount];   //用于存放三个波段
            List bandData = new List();       //存放三个波段进行百分比截断之后的结果
            //对每个波段进行处理
            for (int j = 0; j < bandCount; j++)
            {
                int min = 0 max = 0;
                Band band = imgDatasat.GetRasterBand(j + 1);
                bandArray[j] = band;
                int pixelCount = XSize * YSize;
                //读取波段数据
                int[] dataBuffer = new int[pixelCount];
                band.ReadRaster(0 0 XSize YSize dataBuffer XSize YSize 0 0);
                min = dataBuffer.Min();
                max = dataBuffer.Max();
                int[] histImg = new int[max - min];
                band.GetHistogram(min - 0.5 max + 0.5 max - min histImg 1 0 null null);    //生成直方图
                int[] data = PercentClipStretchImg(dataBuffer pixelCount histImg 0.005 0.995);    //百分比截断
                bandData.Add(data);
            }
            //使用百分比截断后的数值依次对应rgb,生成bitmap
            Bitmap bm = new Bitmap(XSize YSize);
            for (int j = 0; j < YSize; j++)
            {
                for (int i = 0; i < XSize; i++)
                {
                    int[] rgb = new int[3];
                    for (int k = 0; k < bandCount; k++)
                    {
                        rgb[k] = bandData[k][j * XSize + i];
                    }
                    Color color = Color.FromArgb(rgb[0] rgb[1] rgb[2]);
                    bm.SetPixel(i j color);
                }
            }
            Graphics g = Graphics.FromImage(bm);
            bm.Save(jpgPath System.Dr

评论

共有 条评论