Битовая проверка C # TIFF - PullRequest
4 голосов
/ 25 мая 2011

Я пытаюсь определить, использует ли индексированное изображение TIFF 1BPP белый или черный пиксель.Чтобы проверить правильность моего кода, я заставил приложение нарисовать то же изображение, которое оно обработало, на новом изображении.Это когда я заметил некоторые проблемы, и у меня есть биение в голове, пытаясь понять это.

Я почти уверен, что это как-то связано с моим побитовым чеком!

origninal image

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));

                                }
                            }
                        }
                    }
                }
            }

1 Ответ

2 голосов
/ 25 мая 2011

Пользователь,

, похоже, все в порядке, код ниже. Запомните это на всю оставшуюся жизнь: если вы надеетесь получить какой-либо ответ от доски обсуждений, код должен быть пригодным для резки и вставки со всеми использованием и объявлениями!

Теперь я невключите оставшуюся часть частичного класса, потому что он автоматически генерируется c # при запуске проекта.Вы заставляете людей прыгать через обручи, они не будут работать на вас.

Я не смог найти странную функцию GetScanLine.Если это из другой библиотеки, что это такое и какой самый быстрый способ, которым я мог бы проверить это?

Перед запуском я сохранил ваше изображение в c: \ temp \ bw.tif, убедившись, что в MS Paint он установлен как 1bpp.Я также установил точку останова после загрузки файла, чтобы доказать, что свойство .ImageFormat было 1bpp.Результат отображается в c: \ temp \ out.jpg.

Похоже, что существует несколько причин, по которым исходный файл не удался.То, как вы делаете х * 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");
        }
    }
}
...