Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> открыть BMP, открыть 1.BMP и сохранить 2. BMP 
:(
    Опции темы
Kasa89
Дата 23.8.2011, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Народ Хэлп! 
Пишу в 2005 студии на с++. Как написать прогу,которая открывает BMP файл с глубиной цвета как 8-битное так и с глубиной цвета 24 бита, изменить, и записать это изображение во второй BMP файл с глубиной цвета именно 8-бит?

Могу только наоборот - сохранять из 8ми в 24х битное. А в 8 нифига не получается, не могу разобраться с самим изображением, тут ниже приведен пример небольшой:

Код

// 1_1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
//#include "stdio.h"
#include <iostream>
//#include <fstream>
//#include <stdlib.h>
#include "conio.h"
#include <windows.h>
#include <wingdi.h>
using namespace std;
//unsigned long int palitra[256][3];            //в целом - 16 777 216 цветов (256x256x256) для bmp 24 бит

bool Convert256To24 (char *ffile1, char *ffile2)
{
        FILE *file1, *file2;
        BITMAPFILEHEADER bitmapFileHeader;
        BITMAPINFOHEADER bitmapInfoHeader;
        RGBQUAD Palette[256];
        BYTE *inBuf;
        RGBTRIPLE *outBuf;
        int i,j;
        
                    //ofstream outfile("1.txt",ios::binary);
        file1=fopen("f111.bmp","rb");
        file2 = fopen("f112.bmp", "wb");
        if(file1==NULL)
        {
            printf("Ошибка %s\n","имя");
            getch();
            return NULL;
    }
        // Прочтем данные
//fseek(file1, 0, 0);
        fread(&bitmapFileHeader,sizeof(BITMAPFILEHEADER),1,file1);
//fseek(file1, sizeof(BITMAPFILEHEADER), 0);
        fread(&bitmapInfoHeader,sizeof(BITMAPINFOHEADER),1,file1);
        fread (Palette, 256 * sizeof(RGBQUAD),1,file1);

        // Проверка типа файла
        if (bitmapFileHeader.bfType!=0x4D42)
        {
            cout<<"ne bitmap";
            fclose(file1);
            return NULL;
        }

        cout<<"Type of file:      "<<bitmapFileHeader.bfType<<endl;                     //bfType — тип файла, символы «BM» (в HEX: 0x42 0x4d).
        cout<<"Size of all file: "<<bitmapFileHeader.bfSize<<endl;                    //bfSize — размер всего файла в байтах
        
        cout<<"Width:            "<<bitmapInfoHeader.biWidth<<endl
            <<"Heigh:            "<<bitmapInfoHeader.biHeight<<endl
            <<"biBitCount:        "<<bitmapInfoHeader.biBitCount<<endl                // количество бит на пиксел.
            <<"biClrUsed:        "<<bitmapInfoHeader.biClrUsed<<endl                    // количество используемых цветовых индексов в палитре, =0 если индексов МАХ
            <<"rastr nachinaetsya: "<<bitmapFileHeader.bfOffBits<<endl
            <<"sizeofFH:        "<<sizeof(BITMAPFILEHEADER)<<endl
            <<"sizeofIH:        "<<sizeof(BITMAPINFOHEADER)<<endl;

    // Установим указатель на начало растра
    SetFilePointer (file1, bitmapFileHeader.bfOffBits, NULL, FILE_BEGIN);
    SetFilePointer (file2, bitmapFileHeader.bfOffBits, NULL, FILE_BEGIN);

    int Width = bitmapInfoHeader.biWidth;//ширина
    int Height = bitmapInfoHeader.biHeight;//высота
    unsigned long OffBits = bitmapFileHeader.bfOffBits;

    // Выделим память
    inBuf = new BYTE [Width];//буфер для хранения считанного растра
    outBuf = new RGBTRIPLE [Width];

    // Заполним заголовки
    bitmapFileHeader.bfOffBits = sizeof (bitmapFileHeader) + sizeof (bitmapInfoHeader);    // Не будем писать палитру
cout<<"new rastr nachinaetsya: "<<bitmapFileHeader.bfOffBits<<endl;
    bitmapInfoHeader.biBitCount = 24;
    bitmapFileHeader.bfSize = bitmapFileHeader.bfOffBits + 4 * Width * Height + Height * (Width % 4);        // Размер файла
cout<<"new bfSize: "<<bitmapFileHeader.bfSize<<endl;                    //bfSize — размер всего файла в байтах

    // Запишем заголовки
        fwrite(&bitmapFileHeader,sizeof(BITMAPFILEHEADER),1,file2);
        fwrite(&bitmapInfoHeader,sizeof(BITMAPINFOHEADER),1,file2);
//fread (Palette, 256 * sizeof(RGBQUAD),1,file2); //здесь можно просто сразу записать палитру

        SetFilePointer (file1, (3 * Width) % 4, NULL, FILE_CURRENT);

    // Начнем преобразовывать
for (j = 0; j < Height; j++)
    {
        fread(inBuf,Width,1,file1);
        for (i = 0; i < Width; i++)
        {
            /*if (j>73 && j<450 && i>160 && i<470)
            {
            outBuf[i].rgbtRed = Palette[inBuf[i]].rgbRed-28;
            outBuf[i].rgbtGreen = Palette[inBuf[i]].rgbGreen-28;
            outBuf[i].rgbtBlue = Palette[inBuf[i]].rgbBlue-28;
            
            //line(startx,starty,endx,starty,color_code);  //рисуем линию
            }
            else {*/
            outBuf[i].rgbtRed = Palette[inBuf[i]].rgbRed;
            outBuf[i].rgbtGreen = Palette[inBuf[i]].rgbGreen;
            outBuf[i].rgbtBlue = Palette[inBuf[i]].rgbBlue;
                //}
        }
        fwrite(outBuf,sizeof(RGBTRIPLE) * Width,1,file2);

        //выравнивание
        fwrite(Palette,Width % 4,1,file2);
        SetFilePointer (file1, (3 * Width) % 4, NULL, FILE_CURRENT);
    }
    delete inBuf;
    delete outBuf;
    fcloseall();
    getch();
    return 0;
}
//*****************************************************************************

int main ()
{

    cout <<"   "<<endl;
Convert256To24 ("f111.bmp", "f112.bmp");

return  1;
}
//*****************************************************************************



Это сообщение отредактировал(а) Kasa89 - 23.8.2011, 11:25
PM MAIL   Вверх
Kasa89
Дата 23.8.2011, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



и как потом снова обратиться к изображению,чтоб изменить, нарисовать прямоугольную рамку поверх?
PM MAIL   Вверх
xvr
Дата 23.8.2011, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Преобразование 24 бит -> 8 бит весьма непростая операция. Нужно будет все исходные цвета (вплоть до всех 16М цветов) уложить в палитру из 256 цветов. Тут придется или подбирать палитру так, что бы разница между оригиналом и результатов была минимальна (но даже минимальная может быть неприемлима), либо преобразовывать растр (см. дитеринг)

PM MAIL   Вверх
Kasa89
Дата 23.8.2011, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А Преобразование 8 бит -> 8 бит как реализуется? тоже фигня с самим изображением...

И как обратиться к файлу (8 бит),считать его таким же + записать рамочку на такой-то координате...ну или вообще как-то записать,чтоб понять принцип

буду оч благодарна!

Это сообщение отредактировал(а) Kasa89 - 23.8.2011, 12:26
PM MAIL   Вверх
bsa
Дата 23.8.2011, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



палитризацию лучше всего делает алгоритм neuquant.

Это сообщение отредактировал(а) bsa - 23.8.2011, 12:57
PM   Вверх
Kasa89
Дата 23.8.2011, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(bsa @ 23.8.2011,  12:57)
палитризацию лучше всего делает алгоритм neuquant.

сслылочка полезная,спасибо! читаю
PM MAIL   Вверх
mrgloom
Дата 23.8.2011, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



opencv может и открыть и сохранить и рамку нарисовать.
PM MAIL   Вверх
Kasa89
Дата 23.8.2011, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(mrgloom @ 23.8.2011,  13:53)
opencv может и открыть и сохранить и рамку нарисовать.

как ее подключить? 
я тут скачала версию 2.3
PM MAIL   Вверх
mrgloom
Дата 23.8.2011, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



PM MAIL   Вверх
Kasa89
Дата 29.8.2011, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



работать буду без подключения доп. библиотек
нужен код Преобразования БМП 24 бит -> 8 бит или считывание 8бит ->8бит

mrgloom,ссылочку смотрела,спасибо,суть ясна,но буду использовать библиотеку в другом проекте в будущем =)

Это сообщение отредактировал(а) Kasa89 - 29.8.2011, 16:10
PM MAIL   Вверх
bsa
Дата 29.8.2011, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Kasa89, я же тебе дал ссылку на алгоритм преобразования 24->8.
PM   Вверх
Kasa89
Дата 29.8.2011, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(bsa @ 23.8.2011,  12:57)
палитризацию лучше всего делает алгоритм neuquant.

с реализацией кода в С++ ничерта не получается!
PM MAIL   Вверх
bsa
Дата 29.8.2011, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



А реализация на С чем не подходит?
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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