在16位TIFF存取像素(Access pixels in a 16-bit TIFF)

2019-10-18 01:42发布

我已经导入了灰阶16位图像。 我有它BOT作为的BitmapSource和(对照命名空间)中的图像。 我怎样才能访问单个像素? 是CopyPixels我看过的唯一或最好的方式是什么? 如果是这样,我不明白如何设置步幅,并且像素包含的像素亮度值。

方法一:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.IO;
using Nikon;
using WindowsFormsApplication1;
using System.Windows.Media.Imaging;
using System.Drawing;
using System.Drawing.Imaging;
using System.Windows.Controls;

namespace Map
{
    class OpenTIFF
    {
        static void OpenOne()
        {
        // Open a Stream and decode a TIFF image
        Stream imageStreamSource = new FileStream("C:\\Users\\Me\\Desktop\\"MyTif.tif", FileMode.Open, FileAccess.Read, FileShare.Read);
        TiffBitmapDecoder decoder = new TiffBitmapDecoder(imageStreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
        BitmapSource bitmapSource = decoder.Frames[0];
        System.Windows.Controls.Image image = new System.Windows.Controls.Image();
        image.Source = bitmapSource;
        }
    }
}

我认为这可能是简单的(发现这里 ),但后来我很清楚如何访问单个像素在一维字节数组。

方法2:

static void OpenTwo()
       {
           System.Drawing.Image imageToConvert = System.Drawing.Image.FromFile("aa.tif", true);
           byte[] Ret = new byte[0];
           using (MemoryStream ms = new MemoryStream())
           {
               imageToConvert.Save(ms, ImageFormat.Tiff);
               Ret = ms.ToArray();
           }
       }

谢谢,丹

Answer 1:

您可能要检查出免费的图片库。 它有一个C#包装。 http://freeimage.sourceforge.net/index.html

为了让您开始,给一个简单的例子:

  1. 下载二进制分发
  2. 开放FreeImage.NET.sln在Visual Studio(我用2010)
  3. 建库项目
  4. 如果你在XML注释接收错误如下:走在项目属性,下建立,改变从“全能”到“无”,“警告视为错误”
  5. 创建新的控制台项目。
  6. 添加引用您在步骤3中生成的程序集。
    FreeImage3154Win32 \的FreeImage \包装\ FreeImage.NET \ CS \图书馆\ BIN \调试\ FreeImageNET.dll
  7. 下面的代码添加到Program.cs中

     using FreeImageAPI; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { // load image, this can by your 16-bit tif FIBITMAP dib = FreeImage.LoadEx("myfile.tif"); // convert to 8-bits dib = FreeImage.ConvertToGreyscale(dib); // rotate image by 90 degrees dib = FreeImage.Rotate(dib, 90); // save image FreeImage.SaveEx(dib, "newfile.png"); // unload bitmap FreeImage.UnloadEx(ref dib); } } 

    }

  8. 复制您下载到bin目录中的二进制FreeImage的DLL。
    FreeImage3154Win32 \的FreeImage \ DIST \ FreeImage.dll
  9. 运行应用程序

还有就是在包含该库项目的解决方案的例子一个很好的选择。



Answer 2:

您的详细步骤几乎我需要什么......太多的感谢。

我也跟着方向类似于安装你在相关的(你的步骤1-3) 线程 。 这是成功的,正是因为罗穆卢斯说。

下面是需要一些额外的细节和错误,我碰到了(我希望它不是太多细节......希望能帮助别人谁运行到这一点)。

我跟着步骤4起你的方向(除了我添加到我的exisitng windows应用程序)。 我复制了FreeImage.dll(第8步)到我的项目的bin目录。

我运行代码,并得到这个错误:

类型的未处理的异常“System.BadImageFormatException”发生在WindowsFormsApplication1.exe

其他信息:试图加载程序格式不正确。 (从HRESULT异常:0x8007000B)

我有两个错误。 首先是,我没有复制到FreeImage的二进制DLL(上面步骤8)到项目的正确的bin目录(我有它复制到bin和不BIN \调试8-)。 我把它复制到:

\ WindowsFormsApplication1 \ BIN \调试

其次,如果我现在运行它,我得到一个错误:

类型的未处理的异常“System.TypeInitializationException”发生在WindowsFormsApplication1.exe

其他信息:对“WindowsFormsApplication1.Form1”的类型初始值引发异常。

这里的解决方案是构建平台更改为86。 我发现无论是选择86,或与身高的32位盒子任何CPU检查工作。 提示对于像我这样的初学者:构建平台由项目名称(不解决方案)并选择属性,右键单击访问。 它也可以从Debug菜单,在底部将是“MyProject的属性”访问。 或者这也适用:

所以,这两个补丁,代码运行正常。 但是,文件输出为0KB。 但是,这是另一篇文章...

谢谢!



文章来源: Access pixels in a 16-bit TIFF