2

16ビットのtiff画像を取得できる方法があります。関連情報のみを保持しています。

私は主に使用します:

        Stream imageStreamSource = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read);
        TiffBitmapDecoder decoder = new TiffBitmapDecoder(imageStreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
        
        BitmapSource bitmapSource = decoder.Frames[0];
        w = bitmapSource.PixelWidth; h = bitmapSource.PixelHeight;//width and height

        stride = w * bitmapSource.Format.BitsPerPixel / 8;//stride
        int byteSize = stride * h * bitmapSource.Format.BitsPerPixel / 16;//16 for a ushort array
        data = new ushort[byteSize];
        
        bitmapSource.CopyPixels(data, stride, 0); //Get pixels data into data array
        //bmpSource = bitmapSource;//used for reference
        originalFileData = new ushort[data.Length / 2];//used for reference (1 dimensional array representing the adus )
        Array.Copy(data, originalFileData, originalFileData.Length);
        bmp.WritePixels(new Int32Rect(0, 0, w, h), originalFileData, stride, 0);

WritePixelsメソッドに渡した配列を追跡し、それを「Filedata」と呼んで画像処理を少し行います。

私はトリミング方法を持っています:

crop(Rect rect) 
    {
    int newWidth=(int)Math.Floor(rect.TopRight.X-rect.TopLeft.X);
    int newHeight=(int)Math.Floor(rect.BottomRight.Y-rect.TopRight.Y);
    ushort[] newdata=new ushort[newWidth*newHeight];
    for (int i = (int)rect.TopLeft.X, i2 = 0; i2 < newWidth; i++, i2++)
        for (int j = (int)rect.TopLeft.Y, j2 = 0; j2 < newHeight; j++, j2++)
            newdata[j2 * newWidth + i2] = Filedata[j * Width + i];

そして、この方法で配列newdataから新しいイメージを作成しようとします。

        WriteableBitmap bmp = new WriteableBitmap(newWidth, newHeight, dpi, dpi, PixelFormats.Gray16, null);
        bmp.WritePixels(new Int32Rect(0, 0, newWidth, newHeight), newdata,stride, 0);
        

しかし、この最後のメソッドは私にこの例外を与えます:

「タイプ'System.ArgumentException'の未処理の例外がPresentationCore.dllで発生しました

追加情報:バッファサイズが十分ではありません。」

今、私が見る限り、私は前半と同じ方法を後半で使用していますが、トリミングできません!

どんな助けでも大歓迎です!どうもありがとう!

4

1 に答える 1

3

stride値は更新長方形の実際の幅と一致する必要があると思います。

stride = newWidth * (bmp.Format.BitsPerPixel + 7) / 8;
bmp.WritePixels(new Int32Rect(0, 0, newWidth, newHeight), newdata, stride, 0);
于 2012-12-05T16:52:25.050 に答える