Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Bitmap.Save качество


Автор: NOT 31.3.2009, 14:25
Привет всем! Есть png файл с изображением, нужно получить альфа-маску. Код:
Код

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private Image imgPNG;

        private void Form1_Load(object sender, EventArgs e)
        {
            // оригинал
            imgPNG = Image.FromFile("C:\\4-0.png");
            // выводим на форме
            pictureBox1.Image = imgPNG;
            // для обработки
            Bitmap bmp = new Bitmap("C:\\4-0.png");
            BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height),
                    ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
            unsafe {
                byte *pxData = (byte*)bmpData.Scan0;
                for (int j = 0; j < bmpData.Height; ++j) {
                    for (int i = 0; i < bmpData.Width; ++i) {
                        byte alpha = *(pxData + 3);
                        if (alpha > 0) {
                            *(pxData + 0) = 255;
                            *(pxData + 1) = 255;
                            *(pxData + 2) = 255;
                            *(pxData + 3) = alpha;
                        }
                        if (alpha == 0) {
                            *(pxData + 0) = 0;
                            *(pxData + 1) = 0;
                            *(pxData + 2) = 0;
                            *(pxData + 3) = 255;
                        }
                        pxData += 4;
                    }
                }
            }
            // unlock bits
            bmp.UnlockBits(bmpData);
            // saving file
            FileStream myFileOut = new FileStream("c:\\image.png", FileMode.Create);
            bmp.Save(myFileOut, ImageFormat.Png);
            результат обработки выводим на форму рядышком  оригиналом
            pictureBox2.Image = bmp;
            myFileOut.Close();
            
        }
    }

Результат на форме:
user posted image
Результат в файле:
user posted image
Как можно увидеть на обоих рисунках результат разный. Почему в файле появились "зубчики" по контуру? Как можно исправить? Может для кого-то это очевидно, но я впервые пишу на шарпе, так что по шапке не бить ) Оч критично.
Спасибо

Автор: NightmareZ 31.3.2009, 15:26
Вместо
Код

if (alpha > 0) {
    *(pxData + 0) = 255;
    *(pxData + 1) = 255;
    *(pxData + 2) = 255;
    *(pxData + 3) = alpha;
}

напиши
Код

if (alpha > 0) {
    *(pxData + 0) = alpha;
    *(pxData + 1) = alpha;
    *(pxData + 2) = alpha;
    *(pxData + 3) = alpha;
}

Автор: NOT 31.3.2009, 15:51
Цитата(NightmareZ @ 31.3.2009,  15:26)
Вместо
Код

if (alpha > 0) {
    *(pxData + 0) = 255;
    *(pxData + 1) = 255;
    *(pxData + 2) = 255;
    *(pxData + 3) = alpha;
}

напиши
Код

if (alpha > 0) {
    *(pxData + 0) = alpha;
    *(pxData + 1) = alpha;
    *(pxData + 2) = alpha;
    *(pxData + 3) = alpha;
}

В новом варианте контур (там полу-прозрачность для сглаживания) станет серым с прозрачностью вместо белого с прозрачностью - на скорость не влияет, просто переход от белого к черному стал плавнее. Да, смотрится в файле лучше. 
Но почему при сохранении в первичном случае результат другой? Как получить в файле то, что на форме? 
Пните в верном направлении.

Автор: Robust 31.3.2009, 21:43
ИМХО PictureBox перед выводом автоматически применяет к полученной картинке интерполяцию, а сохраняет в png-файл он (PictureBox) как раз то что хранится в свойстве Image. Как сохранить интерполированную картинку я, честно говоря, не знаю. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)