Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
2 / 2 / 1
Регистрация: 29.05.2014
Сообщений: 148
1

Как графический bmp-файл вне зависимости от типа изображения привести к RGB изображению?

28.01.2015, 23:13. Просмотров 1021. Ответов 9
Метки нет (Все метки)


как графический *.bmp файл в не зависимости от типа изображения которое отрываю ( или серая шкала, или CMYK) привести к RGB изображению.
Может существует какая-то специальная функция. А то уже отчаялась искать решения...
спасибо
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.01.2015, 23:13
Ответы с готовыми решениями:

Сохранение RGB изображения после преобразования в файл *.bmp формата
Вот такая ситуация у меня: Есть bmp рисунок и мне нужно сделать с него 24-битную картинку. ...

К изображению в BMP файле употребить фильтр к каждому пикселю в формате RGB
К изображению в BMP файле употребить фильтр к каждому пикселю в формате RGB. Линейный фильтр...

Сохранить в графический файл (tif, jpg, bmp) изображение из blob-поля Oracle
Добрый день, столкнулся с проблемой. В проекте на Delphi есть возможность инсертить в оракловую...

Как получить значения RGB из пикселя картинки .bmp С++
Здравствуйте. Мне нужна функция, которая считает с каждого пикселя картинки в формате .bmp его...

9
Фрилансер
735 / 346 / 96
Регистрация: 05.05.2014
Сообщений: 2,621
28.01.2015, 23:38 2
C#
1
2
3
4
5
6
7
8
9
10
11
    Bitmap bmp = new Bitmap("c:\\Photo.jpg");
    Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
    System.Drawing.Imaging.BitmapData bmpData =
         bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite,
         bmp.PixelFormat);
    IntPtr ptr = bmpData.Scan0;
    int bytes  = Math.Abs(bmpData.Stride) * bmp.Height;
    byte[] rgbValues = new byte[bytes];  
    System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes);
            
  //в rgbValues содержаться значения RGB в зависимости от bmp.PixelFormat может занимать разное число байт
2
2 / 2 / 1
Регистрация: 29.05.2014
Сообщений: 148
29.01.2015, 01:12  [ТС] 3
pro_100_gram, извините, но мне не очень понятно как работает этот код.
Для начала, скажу что путь до *.bmp файла я ввожу в консоли:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;
 
namespace TEST_1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Enter path to image: ");
            string NamefileImage = Console.ReadLine();
      
           Console.ReadKey();
        }
    }
}
Но мне обязательно надо использовать System.Drawing.Bitmap

картинка в *.bmp файле может быть RGBA (4 байта). но основная суть задания в том чтобы картинку сделать RGB (3 байта) и разобрать ее как массив и потом работать уже с этим массивом.
0
Фрилансер
735 / 346 / 96
Регистрация: 05.05.2014
Сообщений: 2,621
29.01.2015, 02:00 4
МАРКИЗОЧКА,
как то так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;
 
namespace TEST_1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Enter path to image: ");
            string NamefileImage = Console.ReadLine();            
            Bitmap bmp = new Bitmap(NamefileImage );
            Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
            System.Drawing.Imaging.BitmapData bmpData =
            bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite,
            bmp.PixelFormat);
            IntPtr ptr = bmpData.Scan0;
            int bytes  = Math.Abs(bmpData.Stride) * bmp.Height;
            byte[] rgbValues = new byte[bytes];  
            System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes);
            if(rgbValues.Length%4 != 0 && rgbValues.Length*2/3*3/2 != rgbValues.Length)
                 throw new Exception("bmp isn't 32bits format");
            byte[] bmp24bitsFormat = new byte[rgbValues.Length*2/3];
            for(int i = 0, j = 0; i < rgbValues.Length && j < bmp24bitsFormat.Length; i+=4)
            {
                bmp24bitsFormat[j++] = rgbValues[i];
                bmp24bitsFormat[j++] = rgbValues[i+1];
                bmp24bitsFormat[j++] = rgbValues[i+2];
            }
            //дальше сами
        }
    }
}
3
2 / 2 / 1
Регистрация: 29.05.2014
Сообщений: 148
29.01.2015, 02:43  [ТС] 5
pro_100_gram, безумно благодарна вам, что помогаете.
но я не очень поняла что в результате получиться. точно увидела что картинка будет в RGB, но будет ли этот код переводить не только с RGBA в RGB, но и с CMYK в RGB, и серую шкалу в RGB?

и я совсем не поняла вот этого куска:

C#
1
2
3
4
5
6
for(int i = 0, j = 0; i < rgbValues.Length && j < bmp24bitsFormat.Length; i+=4)
            {
                bmp24bitsFormat[j++] = rgbValues[i];
                bmp24bitsFormat[j++] = rgbValues[i+1];
                bmp24bitsFormat[j++] = rgbValues[i+2];
            }
0
Фрилансер
735 / 346 / 96
Регистрация: 05.05.2014
Сообщений: 2,621
29.01.2015, 03:56 6
МАРКИЗОЧКА, это простой пример перевода 32 битного RGBA в 24 битный RGB. остальное сами по аналогии.

Добавлено через 5 минут
берутся 3 байта (RGB) 4 не берется (A), если грубо.
C#
1
2
3
4
5
6
for(int i = 0, j = 0; i < rgbValues.Length && j < bmp24bitsFormat.Length; i+=4)
{
bmp24bitsFormat[j++] = rgbValues[i];
bmp24bitsFormat[j++] = rgbValues[i+1];
bmp24bitsFormat[j++] = rgbValues[i+2];
}
Добавлено через 6 минут
там есть опечатка везде где rgbValues.Length*2/3 надо заменить на 3/4
2
2 / 2 / 1
Регистрация: 29.05.2014
Сообщений: 148
29.01.2015, 22:56  [ТС] 7
pro_100_gram, спасибо, но у меня еще вопросик по поводу заголовка файла который равен 54 битам, ведь информация в нем будет частично уничтожена, если удалять каждый 4 бит.

и еще посоветуйте какими значениями заполнять 2 и 3 биты, если я повышаю глубину цвета (делаю с 8 битного 24 битное изображение).
0
Фрилансер
735 / 346 / 96
Регистрация: 05.05.2014
Сообщений: 2,621
29.01.2015, 23:00 8
МАРКИЗОЧКА, там только ргб, заголовков нет, смело удаляйте. я не знаю как это делается (про глубину), здесь вам гугл поможет, ищите материалы про цифровую обработку изображений.
0
2 / 2 / 1
Регистрация: 29.05.2014
Сообщений: 148
30.01.2015, 14:14  [ТС] 9
pro_100_gram, огромное спасибо. ваши алгоритмы мне ооочень помогли. уже сделала все операции над моими картинками но они у меня получились как массивы бай..и никак не хотят перезаписываться по своему пути как картинки.
может кто-то подскажет почему такая операция не работает у меня
C#
1
2
3
4
            bmp.UnlockBits(bmpData);
            Image returnImage = new Bitmap(NamefileImage);
            MemoryStream ms = new MemoryStream(bmp24bitsFormat);
            returnImage = Image.FromStream(ms);
Добавлено через 3 минуты
кто знает нормально ли то, что каждый раз работая с одним и тем же файлом ptr получает разное значение(к примеру 12124160 или 19333120 или 15007744 ...)

C#
1
2
3
4
5
  System.Drawing.Imaging.BitmapData bmpData; 
            bmpData = bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, bmp.PixelFormat);
 
            // Get the address of the first line
            IntPtr ptr = bmpData.Scan0;
0
Фрилансер
735 / 346 / 96
Регистрация: 05.05.2014
Сообщений: 2,621
30.01.2015, 15:55 10
МАРКИЗОЧКА, прочитайте что-нибудь про программирование и оперативную память.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.01.2015, 15:55

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Как выделить определенный диапазон цвета RGB на картинке bmp?
всем доброго времени суток!помогите,пожалуйста, в написании кода.есть картинка bmp. Надо разложить...

Запись изображения окна в BMP файл
нет определение функцыи DDBToDIB() и WriteDIB(), где найти. Зарание благодарен

Вывод текущего изображения 3D модели в графический файл
Добрый день, Знатоки! Имеется сцена с 3D объектом, созданная с помощью OpenGL + Assimp (Visual...

Конвертер BMP в RGB
Добрый день,помогите пожалуйста, нужно создать конвертер BMP картинки в RGB для дальнейших...

BMP в массив из RGB
Как такое можно провернуть? Глубина цвета - 24. Мб какие библиотеки есть для этого?

Получить RGB bmp файла
Всем привет. Стоит задача получить массив пикселей с помощью Bitmap Я нуб в этом, но написал что...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.