Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.07.2013, 19:24   #1
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
Вопрос Cи из RGB в RGBA

Перевожу картинку из RGB в RGBA, не найду никак ошибку, хотя всё указывает на эту функцию:
Код:
uchar* rgb24_to_rgb32(uchar* A, int dSize){
	uchar* B;
	int i, n;
	if((B = malloc(dSize / 3 * 4)) != NULL){
		for(i = 0; i < dSize / 3; i++)
			for(n = 0; n < 3; n++)
				B[i * 4 + n] = A[i * 3 + n];
	}
	return B;
}
Ошибка в результате

Я понимаю, что ето смещение в начале картинки на четыре или три байта(один пиксель) при отрисовке, но где оно и как его обойти??
do not use your brain

Последний раз редактировалось Кащей; 23.07.2013 в 22:56.
Кащей вне форума Ответить с цитированием
Старый 23.07.2013, 20:14   #2
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

Чорт, оно ещё его и переворачивает.
do not use your brain
Кащей вне форума Ответить с цитированием
Старый 23.07.2013, 22:48   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Самоудаление
waleri вне форума Ответить с цитированием
Старый 23.07.2013, 22:52   #4
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

первый цикл перебирает пиксели - размер в байтах делённый на 3 байта на пиксель, второй перебирает байты по три штуки на пиксель заполняя в ARGB буфере всё кроме альфы, она не используется.
do not use your brain
Кащей вне форума Ответить с цитированием
Старый 23.07.2013, 23:11   #5
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

Может быть это от того, что я игнорирую заголовок переходя сразу к данным, для меня остётся загадкой около 800 байт "лишней" информации, в итоге вывод, что отрисовка начинается грубо говоря не с первого пикселя или не по последний пиксель, от сюда и тенденция к располовиниванию строго по диагонали. Раз я знаю что размер изображения в байтах 255*255*3 и заколовок 40 байт, я счётчик файла перевожу на 39 байт вперёд и считываю данные. С RGBA картинкой никаких проблем, отрисовывается как и задумано, но там изначально есть наличие ненужного мне альфа канала.

Эти рассуждения натолкнули меня на ещё один вывод - 800 байт пиблизительное число + 40 байт заголовка, 255*3 = 765 байт.. Тоесть получается что у меня похерилась линия толщиной в пиксель. Надо найти куда. Есть предположения?
do not use your brain

Последний раз редактировалось Кащей; 23.07.2013 в 23:18.
Кащей вне форума Ответить с цитированием
Старый 23.07.2013, 23:24   #6
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

после пропуска заголовка я подсчитал число пикселей 65285, это не 255х255, это 260 лишних пикселей. Откуда они и зачем нужны...
do not use your brain
Кащей вне форума Ответить с цитированием
Старый 23.07.2013, 23:38   #7
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Почему счетчик переводим на 39 байтов и откуда взялись цифра 800?
Код чтения - в студию... Почему решили, что заголовок 40 байт? О каком формате вообще речь? BMP? На диске? В памяти?
waleri вне форума Ответить с цитированием
Старый 23.07.2013, 23:48   #8
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

Цитата:
Код чтения - в студию
Пажаалуйста
Код:
uchar* open_file(char* fname, int indent, int dSize, int pSize){
	free_all();
	FILE* fp;
	uchar *A;
	if((fp = fopen(fname, "rb")) != NULL){
		fseek(fp, indent, SEEK_SET);
		if((A = malloc(dSize * pSize)) != NULL)
			while(!feof(fp)) fread(A, sizeof(uchar), dSize * pSize, fp);
		fclose(fp);
	}
	return A;
}
Цитата:
Почему счетчик переводим на 39 байтов
Цитата:
Почему решили, что заголовок 40 байт?
Пажаалста
https://ru.wikipedia.org/wiki/BMP
do not use your brain
Кащей вне форума Ответить с цитированием
Старый 23.07.2013, 23:51   #9
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

Цитата:
откуда взялись цифра 800
Я могу только догадываться и наиболее правдивая догадка - это линия длиной около 250 +- 25 пикселей.
Щас я читаю ето:
http://c-site.h1.ru/infa/bmp_struct.htm
do not use your brain

Последний раз редактировалось Кащей; 23.07.2013 в 23:53.
Кащей вне форума Ответить с цитированием
Старый 23.07.2013, 23:58   #10
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

заголовок + информструктура ето 14 или 16 + 40 байт... пропустил, не выровнялось. просто я хочу его пропустить, разбирать заголовки западло, по тому как не используется.
do not use your brain

Последний раз редактировалось Кащей; 24.07.2013 в 00:02.
Кащей вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
RGB в CMYK и CMYK в RGB могут конвертироваться без потери качества? hon Мультимедиа в Delphi 5 19.08.2012 14:41
rgb(***,***,***) Fisherman86 Общие вопросы Delphi 3 31.03.2012 11:40
Смешивание двух RGBA цветов Dj_smart Мультимедиа в Delphi 7 01.03.2012 20:35
Палитра RGB Discovery Microsoft Office Excel 12 11.06.2011 12:04
RGB Flow Kepler Gamedev - cоздание игр: Unity, OpenGL, DirectX 6 09.03.2011 00:58