C#中的TIFF位运算检查

4
我正在尝试确定一个1BPP索引TIFF图像是使用白色像素还是黑色像素。为了检查我的代码是否正确,我让应用程序将处理后的相同图像绘制到新图像上。这时我注意到了一些问题,我一直在努力解决它。
我很确定这与我的按位检查有关!
原始图像 origninal image  A 处理后的图像 enter image description here 测试项目可从http://www.unclickable.net/code/tiffTest.zip下载
unsafe { //flipStartPoint
                int y;
                for (y = 0; y < tiffSource.Height; y++)
                {
                    var Column = (byte*)tiffSource.GetScanlinePointer(y);
                    int x;
                    for (x = 0; x < (tiffSource.Width / 8); x++)
                    {
                        int xm = x * 8;
                        byte b = Column[xm];


                        if (b > 0)
                        {

                                for (int Z = 0; Z < 8; Z++)
                                {


                                    if (((b & (128 >> Z)) != 0))
                                    {
                                        if (lowisWhite)
                                        {
                                            image1.SetPixel((xm + Z), y, Color.FromArgb(0, 255, 255,255));
                                        }

                                    }
                                    else
                                    {
                                        if (!lowisWhite)
                                        {

                                            image1.SetPixel((xm + Z), y, Color.FromArgb(0, 255,255, 255));
                                        }
                                    }

                                }

                        }
                        else
                        {
                            if (!lowisWhite)
                            {
                                for (int Z = 0; Z < 8; Z++)
                                {


                                    image1.SetPixel((xm + Z), y, Color.FromArgb(0, 255, 255, 255));

                                }
                            }
                        }
                    }
                }
            }

如果您不交换黑白颜色,它是否能正常工作? - jcomeau_ictx
我将那张图片替换为一张相同颜色的图片 :( - TimD
1个回答

2

用户,

这段以下的代码能解决问题。请记住一件事情:如果你希望从讨论区得到任何回应,这段代码必须是可剪切和可粘贴的,并且包含所有使用和声明!

我没有包含其余的局部类,因为当你开始一个项目时,c#会自动生成它。如果你让人们跳过一些步骤,他们不会为你工作。

我找不到奇怪的GetScanLine函数。如果它来自另一个库,请告诉我它是什么,并且我该如何快速测试它?

在运行这段代码之前,我将您的图像保存在c:\temp\bw.tif中,并确保在MS Paint中将其设置为1bpp。我还在加载文件后设置了断点,以证明.ImageFormat属性为1bpp。结果出现在c:\temp\out.jpg中。

看起来原始代码失败的原因有几个。你计算x*8或者不计算似乎是重复的或者奇怪的。我采取了不同的方法直接从x和y到像素。

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    unsafe 
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Bitmap tiffSource = new Bitmap("c:\\temp\\bw.tif");
            Bitmap image1 = new Bitmap(tiffSource.Width, tiffSource.Height);

            BitmapData d = tiffSource.LockBits(
                 new Rectangle(new Point(0, 0), tiffSource.Size),
                 ImageLockMode.ReadOnly,tiffSource.PixelFormat);
            for (int y = 0; y < tiffSource.Height; y++)
            {
                byte* Column = (byte*)d.Scan0 + y*d.Stride;

                for (int x = 0; x < (tiffSource.Width ); x++)
                    if ((Column[(int)(x / 8)] & (128 >> (x % 8))) !=0   )
                        image1.SetPixel((x), y, Color.FromArgb(0, 0, 0, 0));
                    else
                        image1.SetPixel((x), y, Color.FromArgb(0, 255, 255, 255));
            }
            tiffSource.UnlockBits(d);
            image1.Save("c:\\temp\\out.jpg");
        }
    }
}

谢谢FastAI,我会试一下的。是的,setpixel仅用于测试。 - TimD
@user498714 - 很酷,我明白了。如果您发布更多的代码,请使用编辑功能并添加到此帖子中,否则我将永远找不到它 - 当我的大脑在忙于我的真正工作项目时,我需要一个“休息”除了咖啡之外,我只会检查主页几次每周。 - FastAl
也发布了一个小版本,看起来干净多了哈哈 - TimD
尝试过((b << Z) & 128) != 0,结果相同,我认为这与位顺序或其他相关。 - TimD
这个有效了,问题在于我使用了8bpp的图像,呃 :( 感谢帮助! - TimD
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接