注意:读取tiff图像的像素值,并非rgb,这是GIS方向的同学应当明晓的事情。
由于本人之前糊里糊涂的将tiff图像的rgb值作为了像素值来读取,白折腾很久很久。希望这篇文章能够为正处于此时期的童鞋做些贡献吧。
正文:
首先,需要在maven中添加上geotools的依赖;明确:geotools是一个开源的 Java GIS 工具包,可利用它来开发符合标准的地理信息系统。这个工具包里面包含了我们需要提取像素值的方法,以及获取图像的经纬度等元数据(这个元数据并非指的是拍摄地点等信息)。文章末会附上下载连接和相关教程以及开发文档。
通过getBounds()方法可以获取图像的经纬度范围:
import java.io.File;
import org.geotools.coverage.grid.GridCoverage2D;
import org.geotools.gce.geotiff.GeoTiffReader;
import org.geotools.geometry.Envelope2D;
public class Localtest {
public static void main(String[] args) throws Exception {
String path = "E:/aod.tiff";
GetImageExt(path);
public static String GetImageExt(String path) {
String strExtent = "";
double coverageMinX = 0.000;
double coverageMaxX = 0.000;
double coverageMinY = 0.000;
double coverageMaxY = 0.000;
try {
String ImageUrl = path.replace("\\", "\\\\");
File ImageFile = new File(ImageUrl);
GeoTiffReader reader = new GeoTiffReader(ImageFile);
GridCoverage2D coverage = reader.read(null);
Envelope2D coverageEnvelope = coverage.getEnvelope2D();
coverageMinX = coverageEnvelope.getBounds().getMinX();
coverageMaxX = coverageEnvelope.getBounds().getMaxX();
coverageMinY = coverageEnvelope.getBounds().getMinY();
coverageMaxY = coverageEnvelope.getBounds().getMaxY();
} catch (Exception e) {
System.out.println(coverageMinX);
System.out.println(coverageMaxX);
System.out.println(coverageMinY);
System.out.println(coverageMaxY);
return strExtent;
这里得到的是图像的经纬度范围。
通过getSampleFloat(i, j, 0)方法可以获取具体像素位置的像素值,该像素值于在arcgis等gis软件内显示识别的内容一致。
Raster sourceRaster = sourceImage.getData();
float[] adsaf = {0};
float[] q = sourceRaster.getPixel(229, 237, adsaf);
float ibandvalue = sourceRaster.getSampleFloat(88, 88, 0);
System.out.println(ibandvalue);
for (int i = 0; i < iwidth; i++) {
for (int j = 0; j < iheight; j++) {
if(sourceRaster.getSampleFloat(i, j, 0)!=0)
System.out.print("(i=" + i + ",j=" + j + ")"+sourceRaster.getSampleFloat(i, j, 0));
System.out.println();
运行结果:

上面代码我只截取了一部分,如果有需要全部可以站内私信发你,输出结果只显示了非0的,但实际应当根据边界判断去遍历图像,下图是在arcgis中识别的结果。

至此可以遍历并保存对比了。
下面是geotools和帮助文档的下载链接和提取码
复制这段内容后打开百度网盘手机App,操作更方便哦
链接:https://pan.baidu.com/s/1wPV9rCyVllUTcBrcUeT1qA
提取码:le88
阿里云盘:https://www.aliyundrive.com/s/ob8TPnTxeGZ
如果觉得本文对您有用请点个赞支持一下。
注意:读取tiff图像的像素值,并非rgb,这是GIS方向的同学应当明晓的事情。由于本人之前糊里糊涂的将tiff图像的rgb值作为了像素值来读取,白折腾很久很久。希望这篇文章能够为正处于此时期的童鞋做些贡献吧。正文:首先,需要在maven中添加上geotools的依赖;明确:geotools是一个开源的 Java GIS 工具包,可利用它来开发符合标准的地理信息系统。这个工具包里面包含了我们需要提取像素值的方法,以及获取图像的经纬度等元数据(这个元数据并非指的是拍摄地点等信息)。文章末会附上下载连接和
从前面的文字中就可以看出,对数字图像的处理都是在像素级上操作的,准确地讲是操作像素点的RGB值,在图像取反和灰度图像转换两篇中已经涉及到了对RGB操作的相关代码,相信大家已经也看到了,就是这一段:for (int j = 0; j < height; j++) {
for (int i = 0; i < width; i++) {
int p = image.getRGB(i
TIFF Java
标记图像文件格式库
是由与合作。 政府拥有“无限权利”,并且正在发布此软件,以通过为开发人员提供向新方向发展的机会来增加政府投资的影响。 中规定了软件的使用,修改和分发权。
如果您想为这个项目做贡献,请提出请求。 我们将审核拉取请求并讨论更改。 该项目的所有请求请求贡献将根据MIT许可证发布。
先前根据开放源代码许可证发布,然后由NGA员工进行修改的软件源代码被视为“联合作品”(请参见17 USC§101); 它具有部分版权,部分公共领域,并且总体上受非政府作者的版权保护,并且必须根据原始开源许可证的条款进行发布。
是用于读取和写入“标记图像文件格式”文件的Java库。 它主要是为了向Android应用程序提供许可友好的TIFF功能而创建的。 实现基于和以下JavaScript实现: :
查看最新的
// File input = ...
public static void getPicArrayData(String path){
BufferedImage bimg = ImageIO.read(new File(path));
int [][] data = new int[bimg.getWidth()][bimg.getHeight()];
for(int i=0;i<bimg.getWidth();
// 锁定位图数据,获取像素值
BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, width, height),
ImageLockMode.ReadOnly, PixelFormat.Format16bppGrayScale);
// 获取像素值的字节数
int stride = bitmapData.Stride;
int bytesPerPixel = stride / width;
// 定义一个二维数组存储像素值
ushort[,] pixels = new ushort[height, width];
// 逐行读取像素值
unsafe
byte* p = (byte*)bitmapData.Scan0;
for (int y = 0; y < height; y++)
for (int x = 0; x < width; x++)
// 获取当前像素的指针
ushort* pixelPtr = (ushort*)(p + y * stride + x * bytesPerPixel);
// 获取像素值
ushort pixelValue = *pixelPtr;
// 存储像素值
pixels[y, x] = pixelValue;
// 解锁位图数据
bitmap.UnlockBits(bitmapData);
上述代码使用LockBits方法锁定位图数据,获取像素值之后再使用UnlockBits方法解锁位图数据。在获取像素值时,使用了指针操作来提高效率。注意,由于C#中的多维数组是按行存储的,因此在存储像素值时,需要按照[y, x]的顺序存储。