Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Bitmap.Save качество, Сохранение рисунка 
V
    Опции темы
NOT
Дата 31.3.2009, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 18.6.2005
Где: UA::CK

Репутация: нет
Всего: нет



Привет всем! Есть 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
Как можно увидеть на обоих рисунках результат разный. Почему в файле появились "зубчики" по контуру? Как можно исправить? Может для кого-то это очевидно, но я впервые пишу на шарпе, так что по шапке не бить ) Оч критично.
Спасибо

Это сообщение отредактировал(а) NOT - 31.3.2009, 14:28
PM MAIL WWW   Вверх
NightmareZ
Дата 31.3.2009, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


[хакер]
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 10.8.2006

Репутация: 2
Всего: 13



Вместо
Код

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



--------------------
NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш
Ely-Art.ru - наша маленькая домашняя арт-студия
mugcraft.ru - кружки на любой вкус
PM WWW ICQ Skype GTalk AOL YIM   Вверх
NOT
Дата 31.3.2009, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 18.6.2005
Где: UA::CK

Репутация: нет
Всего: нет



Цитата(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;
}

В новом варианте контур (там полу-прозрачность для сглаживания) станет серым с прозрачностью вместо белого с прозрачностью - на скорость не влияет, просто переход от белого к черному стал плавнее. Да, смотрится в файле лучше. 
Но почему при сохранении в первичном случае результат другой? Как получить в файле то, что на форме? 
Пните в верном направлении.
PM MAIL WWW   Вверх
Robust
Дата 31.3.2009, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 22.6.2008

Репутация: нет
Всего: 1



ИМХО PictureBox перед выводом автоматически применяет к полученной картинке интерполяцию, а сохраняет в png-файл он (PictureBox) как раз то что хранится в свойстве Image. Как сохранить интерполированную картинку я, честно говоря, не знаю. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0863 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.