Консультация № 181339
14.12.2010, 01:22
0.00 руб.
0 13 1
Здравствуйте, уважаемые эксперты! Можете пожалуйста помочь с разработкой программы ?

Разработать программу для обработки растровых изображений, хранящихся в файлах формата BMP (BitMaP) :

Изменить яркость изображения. Самый простой способ - изменить значения ком-понентов всех пикселей растрового изображения на некоторое значение V, лежа-щее в диапазоне от -255 до 255 (отрицательные значения уменьшают яркость, по-ложительные - увеличивают) и вводимое из текстового файла (но лучше, если из командной строки).

Далее условия выполнения (и есть еще структура заголовка которая приведена в таблице)

(РАСТРОВЫЕ ИЗОБРАЖЕНИЯ

Растровое изображение представляет собой матрицу пикселей, каждый из которых имеет свой цвет. Основными характеристиками растрового изображения являются разре-шение и глубина цвета. Разрешение определяет размеры изображения: его длину (количе-ство пикселей в строке) и высоту (количество строк). Глубина цвета определяет количест-во используемых в изображение цветов и оттенков. Глубина цвета зависит от выбранной цветовой модели, а также количества бит, отводимых для хранения цвета одного пикселя изображения. Наиболее распространенной цветовой моделью является цветовая модель RGB (Red, Green, Blue), в соответствии с которой цвет пикселя изображения описывается последовательностью из трех значений: интенсивность красного, зеленого и синего цве-тов.

ФОРМАТ BMP ФАЙЛА

В файле формата bmp можно выделить несколько частей:
• заголовок;
• палитра (присутствует только в палитровых изображениях, их рассматривать не будем);
• массив пикселей изображения.
Заголовок описывает основные характеристики хранимого изображения. Он располо-жен в самом начале файла и всегда занимает 54 байта. )

Обсуждение

Неизвестный
14.12.2010, 06:59
общий
Вам программа нужна под какую платформу?
Неизвестный
14.12.2010, 07:26
общий
windows
Неизвестный
14.12.2010, 07:41
общий
Вот здесь есть пример с исходниками: http://www.codeproject.com/KB/graphics/imagepreview.aspx
Неизвестный
14.12.2010, 12:05
общий
это ответ
Здравствуйте, Алексей!

Вот здесь есть пример с исходниками: http://www.codeproject.com/KB/graphics/imagepreview.aspx
5
Неизвестный
14.12.2010, 18:11
общий
Если честно не очень понимаю с++...можете пожалуйста помочь мне написав программу ?
Неизвестный
14.12.2010, 20:44
общий
А Вам нужно на чистом C ? И без использования WinAPI ?
Что-то мне подсказывает, что именно так... Иначе зачем бы у Вас в задании было сказано про то, что заголовок BMP занимает 54 байта...
Уточните, пожалуйста, под какой стандарт писать и какие можно использовать средства.
Неизвестный
14.12.2010, 20:55
общий
Все именно так. Препод сказал использовать потоки для преобразования изображения в матрицу и с ними работать. использовать лишь стандартные средства, никаких посторонних библиотек
Неизвестный
14.12.2010, 21:07
общий
Алексей, к сожалению, не имею времени написать код... Да и слишком мало информации Вы даете, так и не ответили на вопрос, под какой стандарт писать? "Потоки" понятие тоже растяжимое... Потоки бывают разные.
Опять же, Вы сами сказали выше, что писать нужно под windows... А как можно писать под нее, не используя ее библиотеки?
И понятие "стандартные средства" мне тоже непонятно... это что за средства?
В общем нужна четкая постановка.
Неизвестный
14.12.2010, 21:13
общий
я прикрепил задание.
про стандартные средства - это стандартные библиотеки изначально включенные в состав среды программирования.

Прикрепленные файлы:
0c2cea6b53084bd165bbf89954c26f47.doc
Неизвестный
15.12.2010, 06:49
общий
Если нужна полная поддержка всех функций BMP-формата, в том числе и RLE-сжатия, посмотрите пример вот здесь: http://david.tribble.com/src/bmp/bmp.html.
Попроще вариант можно посмотреть вот здесь: http://stackoverflow.com/questions/1531268/getting-rgb-values-for-each-pixel-from-a-24bpp-bitmap-in-c/1532386#1532386.
Здесь несколько вариантов чтения и распечатки по-пиксельно BMP-файлов, причем разбитых по цветам R, G, B.
Вам просто нужно умножить весь массив на нужный коэффициент для регулировки яркости и обратно сохранить в BMP (в примерах выше также описано и сохранение обратно в файл).
Неизвестный
19.12.2010, 03:09
общий
выдает практически одни помехи или кусок изображения с обращенными цветами. Не работает с большими bmp. сама программа просто копирует bmp файл попиксельно.
программа в прикрепленном файле
Прикрепленные файлы:
f27cf9ca7a3f013fcf55b0bdd81a1861.txt
Неизвестный
19.12.2010, 13:36
общий
Код изменился. Теперь не глючит с большими файлами, но не хочет обрезать нормально изображение.
Можете помочь?
Прикрепленные файлы:
d8b1cf6b6b5bb3e2dd672e0735ca468b.txt
Неизвестный
19.12.2010, 14:17
общий
Модифицировал Ваш первый пример, меняет яркость в зависимости от переменной adjust_brightness:

Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#pragma pack(1)

int adjust_brightness = 100; //-255 .. +255

typedef struct
{
char signature[2];
unsigned int fileSize;
unsigned int reserved;
unsigned int offset;
unsigned int headerSize;
unsigned int width;
unsigned int height;
unsigned short planeCount;
unsigned short bitDepth;
unsigned int compression;
unsigned int compressedImageSize;
unsigned int horizontalResolution;
unsigned int verticalResolution;
unsigned int numColors;
unsigned int importantColors;

} BmpHeader;

int main(int argc, char **argv) {

FILE *inFile,*outFile;
long bytesPerLine;
BmpHeader header;
unsigned char *line;

inFile = fopen( "aa.bmp", "rb" );
if( !inFile ) {
printf( "Error opening file %s.\n", argv[1] );
return -1;
}

if( fread(&header, 1, sizeof(BmpHeader), inFile) != sizeof(BmpHeader) ) {
printf( "Error reading bmp header.\n" );
return -1;
}

bytesPerLine = (3 * (header.width + 1) / 4) * 4;

outFile = fopen( "bb.bmp", "wb" );
if( !outFile ) {
printf( "Error opening outputfile.\n" );
return -1;
}


fwrite(&header,1,sizeof(BmpHeader),outFile);

line = new unsigned char[bytesPerLine];
for (int i = 0; i < header.height; i++)
{
fread(line, 1, bytesPerLine, inFile);

for (int j=0; j<bytesPerLine; j++)
{
if (line[j]+adjust_brightness > 255) line[j]=255;
else if (line[j]+adjust_brightness < 0) line[j]=0;
else line[j]=line[j]+adjust_brightness;
}

fwrite(line, bytesPerLine, 1, outFile);
}
printf( "Done.\n" );
fclose(inFile);
fclose(outFile);

printf( "\nBMP-Info:\n" );
printf( "Width x Height: %i x %i\n", header.width, header.height );
printf( "Depth: %i\n", (int)header.bitDepth );

free(line);
return 0;
}
Форма ответа