Алексей: хм, если написать sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+pow(2,BMInfoHeader.BitCount) - т.е для 4 бит - 54+2^4 - то не сработает... А вот если 2^6 - нормально)
Алексей: И то и другое, свой вариант я уже сделал) Теперь вот интереса ради делаю другие варианты, потом наверное сделаю и что-то вне заданий.. Можно попробовать RLE сделать, оно вроде довольно простое, хотя не знаю, как в случае изображений дела обстоят, нужно будет почитать про это) Тут еще такая проблемка возникла - фотошоп, да и некоторые другие редакторы почему-то вот так открывают мою картинку вот так - https://pp.vk.me/c626428/v626428377/10f1c/iOP1BRSW... , хотя в стандартном просмотрщике фотографий все ок. Это из-за того, что я пока не сделал кратность строк ? Или я что-то не то в заголовок пишу?
а не подскажите, как в 4 бита перевести ? Т.е мне нужно сначала писать первые 4 разряда, потом сдвигать на 4,опять писать первые 4 разряда, а потом инвертировать? Или еще как?
Алексей: он у меня и так преобразовывался в Grayscale) И 128 ее слишком темной делает, 100-110 ничего так)
Только у меня коэффы другие... 0.299*R + 0.597*G + 0.114*B
Это вроде для 32-битных, я то пока с простенькими - 8-битными пытаюсь разобраться .. Просто я действительно пишу ширина*высота*размер структуры(4) байт, хотя нужно просто высота*ширина байт... И еще я видимо сжатие не учитываю, хотя оно видимо есть) В общем там и не разобрался, если писать в 4 раза меньше байт - то некоторые картинки все же правильно сохраняются, а некоторые нет..
Алексей: да уже вроде и byte *palette_img объявил и palette_img = new byte[size] , и fread(palette_img, 1, size, f) делаю - а все равно выходной файл больше входного... byte - unsigned char . Причем что странно - картинка 127х64, стало быть нужно минимум 8,128 байт чтобы ее записать + заголовок, а она весит 4 198 байт..
Алексей: так а как я могу считать по-другому, если у меня RGBQUAD занимает 4 байта... Я же не могу там fread(Rgbquad[i], 1, BMInfoHeader.Width, f) - т.к тогда он в RGBQUAD только значение одного цвета прочитает...
в Rgbquad я пишу само изображение, оно у меня в классе объявлено - RGBQUAD **Rgbquad;
RGBQUAD - это вот такая структура -
struct RGBQUAD
{
byte Blue;
byte Green;
byte Red;
byte Reserved;
};
Алексей: Спасибо за разъяснение! Просто нужно было действительно BMInfoHeader.Height строк писать а не BMInfoHeader.Width ) Поменял - все заработало) Спасибо!
Алексей: да считал данные он нормально - т.е если я их считываю построчно, а вывожу побайтово - все ок. Но вот если пытаюсь вывести построчно - ошибка https://habrastorage.org/files/a8d/c8a/77f/a8dc8a7...
Правда файл он вроде сохраняет, сейчас скину что там
хех, похоже на то) Хотя странно - вроде брал самое стандартное изображение.. Попробовал вот с этим -https://www.w3.org/People/mimasa/test/imgformat/im... - теперь он его читает и построчно и побайтово, а вот записывать построчно ну ни в какую не хочет.. Или вообще нельзя так записывать динамический массив?