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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> RGB -> Grayscale 
V
    Опции темы
Devider
Дата 20.2.2006, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте!
Суть проблемы вот в чем: необходимо из цветной картинки (например, PixelFormat.Format24bppRgb) сделать ее же чернобелый аналог (например, PixelFormat.Format16bppGrayScale). По скольку готовых решений не нашел, сел изобретать велосипед сам. Создаю такой же Bitmap по размеру:
Код
Bitmap b = new Bitmap(w,h, PixelFormat.Format16bppGrayScale);

Дальше надеялся на
Код
Rectangle r = new Rectangle(0,0,w,h);
BitmapData bd = b.LockBits(r, ImageLockMode.ReadWrite, b.PixelFormat);
unsafe
{
   byte* p = (byte*)(void*)bd.Scan0;
   for (x = 0; x < bd.Stride*h; x++)
   {
       //А вот тут сделать все, что надо.
   }
}
b.UnlockBits(bd);

Но вылетает ArgumentException {"Parameter is not valid."} на попытку этот битмап нарисовать.
И даже такой код не работает
Код
Bitmap b1 = new Bitmap(100, 100, PixelFormat.Format16bppGrayScale);
pictureBox1.Image = b1; 

хотя это работает:
Код
Bitmap b2 = new Bitmap(100, 100, PixelFormat.Format16bppRgb565);
pictureBox2.Image = b2;

Почему??

Это сообщение отредактировал(а) Devider - 20.2.2006, 18:02
PM MAIL   Вверх
cardinal
Дата 20.2.2006, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

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



Цитата(Devider @ 20.2.2006, 16:00 Найти цитируемый пост)
По скольку готовых решений не нашел, сел изобретать велосипед сам.

Готовое решение найдешь по слову dither на этом форуме (в поиске поищи вместе с моим ником) или в том же googl'e...


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Devider
Дата 20.2.2006, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



По форуму ничего не нашел, кроме этого поста! =)
Мона ссылочку?
PM MAIL   Вверх
cardinal
Дата 20.2.2006, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

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



Да сколько хочешь... smile
http://forum.vingrad.ru/index.php?act=Sear...er&skipped=


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Devider
Дата 20.2.2006, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Просто убрать цвета, это можно. Допустим есть PictureBox pbDoc.
Код

            Bitmap b = (Bitmap)pbDoc.Image;
            MessageBox.Show(pbDoc.Image.PixelFormat.ToString());
            BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
            int stride = bmData.Stride;
            System.IntPtr Scan0 = bmData.Scan0;
            unsafe
            {
                byte* p = (byte*)(void*)Scan0;
                int nOffset = stride - b.Width * 3;
                byte red, green, blue;
                for (int y = 0; y < b.Height; ++y)
                {
                    for (int x = 0; x < b.Width; ++x)
                    {
                        blue = p[0];
                        green = p[1];
                        red = p[2];
                        p[0] = p[1] = p[2] = (byte)(.299 * red + .587 * green + .114 * blue);
                        p += 3;
                    }
                    p += nOffset;
                }
            }
            bmData.PixelFormat = PixelFormat.Format16bppGrayScale;
            b.UnlockBits(bmData);
            pbDoc.Image = b;
            MessageBox.Show(pbDoc.Image.PixelFormat.ToString());

Из примера оба мессаджбокса покажут, что формат не меняется, в т.ч. не смотря на строку bmData.PixelFormat = PixelFormat.Format16bppGrayScale;
В дельфи и в ВБ, сорри, не силен.. =( Кроме того, так и не понял, пример из первого поста
(Bitmap b1 = new Bitmap(100, 100, PixelFormat.Format16bppGrayScale);
pictureBox1.Image = b1; ) почему не работает... Наверное, это основной вопрос: как работать в .NET с PixelFormat.Format16bppGrayScale. Размер файла, если ч/б картинку сохранить, изменится но сравнению с цветной, но незначительно, и то, сильно подозреваю, в этом заслуга исключительно JPEG... Хелп!!!
PM MAIL   Вверх
cardinal
Дата 20.2.2006, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

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



А что тебе говорят слова палитра? Структура файла? Ты знаешь как выглядит точка в твоем файле? Ну так вперед - читать!

И еще определись, что тебе нужно ч/б картинка или все таки grayscale. Тут есть некая разница... (а в размере не некая, а очень ощутимая!)


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Devider
Дата 20.2.2006, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Оу, йес, говорят! И точка как выглядит знаю! Я вот не знаю тока как с grayscale работать. А именно это мне и надо. А посылать меня попрошу не вообще, а по конкретному адресу, в т.ч. и читать. =)
PM MAIL   Вверх
cardinal
Дата 21.2.2006, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

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



Ну, тут почитай...
http://forum.vingrad.ru/index.php?showtopi...st&p=260021
Цитата(Devider @ 20.2.2006, 21:29 Найти цитируемый пост)
А посылать меня попрошу не вообще

Я вообще и не посылал... smile


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
mr.DUDA
Дата 21.2.2006, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



Вот готовое решение:
Код
using System;
using System.Drawing;
using System.Drawing.Imaging;

//...

public class GrayscaleFilter
{
    public static void Process(string srcFileName, string dstFileName)
    {
        // грузим картинку и создаём Graphics
        Bitmap img = (Bitmap)Image.FromFile(srcFileName);
        Graphics gr = Graphics.FromImage(img);

        // создаём матрицу преобразования цветов
        ImageAttributes attr = new ImageAttributes();
        attr.SetColorMatrix(new ColorMatrix(new float[][]{ 
            new float[] {0.3f,  0.3f,  0.3f,  0, 0},
            new float[] {0.59f, 0.59f, 0.59f, 0, 0},
            new float[] {0.11f, 0.11f, 0.11f, 0, 0},
            new float[] {0, 0, 0, 1, 0},
            new float[] {0, 0, 0, 0, 1}}
        ));

        // отрисовываем в Graphics с использованием цветовой матрицы
        gr.DrawImage(img, new Rectangle(Point.Empty, img.Size), 0, 0, img.Width, img.Height,
            GraphicsUnit.Pixel, attr);

        // сохраняем обратно в файл
        img.Save(dstFileName, ImageFormat.Jpeg);
    }
}

// ...



--------------------
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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