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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.11.2012, 00:00   #1
Lavandil
Новичок
Джуниор
 
Регистрация: 25.11.2012
Сообщений: 6
По умолчанию с++, .BMP

пытаюсь заставить этот код работать, для начала просто открываю бмп файл, и сохраняю данные в другой бмп файл, так вот с 16,256-цветными работает, а с 24-разрядными происходят какие-то странные искажения. Подскажите, в чем может быть проблема?

Исходные 24-битные изображения:
http://clip2net.com/s/2xz01
http://clip2net.com/s/2xz16
То, что на выходе, собственно:
http://clip2net.com/s/2xz1Q
http://clip2net.com/s/2xz29

Цитата:
#include "stdafx.h"
#include <stdio.h>
#include <io.h>
#include <fcntl.h>
#include <sys\stat.h>
#include <windows.h>
#include <errno.h>
extern int errno;

void mmx(void * p1, void * p2, int s)
{
//так можно определять 64-разрядные данные
__int64 mask = 0xffffffffffffffff;
__asm
{
mov esi, p1
mov edi, p2
mov ecx, s

l1:

movq mm2, mask //;обнулить регистр mm2
movq mm0, [esi] //;загрузить восемь байтов спрайта
movq mm1, [edi] //;загрузить восемь байтов фона
pcmpeqb mm2, mm0 //;сделать маску байтов, которые надо вывести
pandn mm2, mm0 //;обнулить ненужные
por mm1, mm0 //;сложить их с байтами спрайта
movq [esi], mm1 //;сохранить их обратно на изображение


/*
movq mm4,[edi]
movq mm3,[esi]
movq mm1,mask

pcmpeqb mm1,mm3
pand mm4,mm1
pandn mm1,mm3
por mm4,mm1
movq [esi],mm4
*/


add esi, 8
add edi, 8
sub ecx,8
cmp ecx,0
jg l1
emms
}
}

int main(int argc, char* argv[])
{
int h_bmp1, h_bmp2, h_bmp3;
if((h_bmp1 = _open("r1.bmp", _O_RDONLY)) == -1)
{
perror( "perror says open failed" );
}

//h_bmp2 = _open("r2.bmp", _O_RDONLY);
if((h_bmp2 = _open("r2.bmp", _O_RDONLY)) == -1)
{
perror( "perror says open failed" );
}
unsigned char * buf_bmp1, * buf_bmp2, * p1, * p2;
unsigned long len_bmp1, len_bmp2;
len_bmp1 = filelength(h_bmp1);
len_bmp2 = filelength(h_bmp2);


p1 = buf_bmp1 = new unsigned char[len_bmp1];
p2 = buf_bmp2 = new unsigned char[len_bmp2];
//buf_bmp1=p1;
_read(h_bmp1, p1, len_bmp1);
_read(h_bmp2, p2, len_bmp2);


BITMAPFILEHEADER bmp_fh1, bmp_fh2;
BITMAPINFO bmp_inf1, bmp_inf2;
bmp_fh1 = *((BITMAPFILEHEADER*)p1);
bmp_fh2 = *((BITMAPFILEHEADER*)p2);
p1 = p1 + sizeof(BITMAPFILEHEADER);
p2 = p2 + sizeof(BITMAPFILEHEADER);
bmp_inf1 = *((BITMAPINFO*)p1);
bmp_inf2 = *((BITMAPINFO*)p2);
p1 = p1 + sizeof(BITMAPINFO)+1024;
p2 = p2 + sizeof(BITMAPINFO)+1024;

//mmx(p2, p1, bmp_inf2.bmiHeader.biSizeImage);

//h_bmp3 = _open("r3.bmp", _O_WRONLY);

h_bmp3 = _open( "r3.bmp", _O_WRONLY | _O_CREAT, _S_IREAD | _S_IWRITE );
if( h_bmp3 == -1 )
{
perror( "Open failed on output file" );
}


_write(h_bmp3,buf_bmp1/*p1*/, len_bmp1);



_close(h_bmp1);
_close(h_bmp2);
_close(h_bmp3);

return 0;
}

Последний раз редактировалось Lavandil; 26.11.2012 в 00:04.
Lavandil вне форума Ответить с цитированием
Старый 26.11.2012, 01:16   #2
crymchanin
Пользователь
 
Аватар для crymchanin
 
Регистрация: 01.02.2012
Сообщений: 84
По умолчанию

в 24 битном изображении в отличии от 16-256 цветных не используется карта цветов.
crymchanin вне форума Ответить с цитированием
Старый 26.11.2012, 01:38   #3
Lavandil
Новичок
Джуниор
 
Регистрация: 25.11.2012
Сообщений: 6
По умолчанию

я понимаю - но я ведь просто копирую файл в буфер, а потом записываю данные в другой файл..
в случае фона - функция _read(h_bmp1, p1, len_bmp1); возвращает 4 байта почему-то, в случае НЛО - нормально читает все байты

Последний раз редактировалось Lavandil; 26.11.2012 в 01:44.
Lavandil вне форума Ответить с цитированием
Старый 26.11.2012, 01:47   #4
crymchanin
Пользователь
 
Аватар для crymchanin
 
Регистрация: 01.02.2012
Сообщений: 84
По умолчанию

Код:
typedef struct tagBITMAPINFO {
  BITMAPINFOHEADER bmiHeader;
  RGBQUAD          bmiColors[1];
} BITMAPINFO, *PBITMAPINFO;
Members
bmiHeader
A BITMAPINFOHEADER structure that contains information about the dimensions of color format.
.
bmiColors
The bmiColors member contains one of the following:
An array of RGBQUAD. The elements of the array that make up the color table.
An array of 16-bit unsigned integers that specifies indexes into the currently realized logical palette. This use of bmiColors is allowed for functions that use DIBs. When bmiColors elements contain indexes to a realized logical palette, they must also call the following bitmap functions:
CreateDIBitmap
CreateDIBPatternBrush
CreateDIBSection
The iUsage parameter of CreateDIBSection must be set to DIB_PAL_COLORS.
The number of entries in the array depends on the values of the biBitCount and biClrUsed members of the BITMAPINFOHEADER structure.
The colors in the bmiColors table appear in order of importance. For more information, see the Remarks section.
crymchanin вне форума Ответить с цитированием
Старый 26.11.2012, 01:57   #5
Lavandil
Новичок
Джуниор
 
Регистрация: 25.11.2012
Сообщений: 6
По умолчанию

Я вообще говоря читал про вот такую:
Цитата:
typedef struct tagBITMAPINFOHEADER
{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER, *PBITMAPINFOHEADER;
НО:
я же специально выделил жирным ту часть кода, которая в данным момент имеет значение, а там это все не используется - либо я не понимаю что ты мне этим хочешь сказать.

P.S. Я же не преобразую из 16 в 24, а просто копирую

Последний раз редактировалось Lavandil; 26.11.2012 в 02:00.
Lavandil вне форума Ответить с цитированием
Старый 26.11.2012, 02:05   #6
Lavandil
Новичок
Джуниор
 
Регистрация: 25.11.2012
Сообщений: 6
По умолчанию

В общем создал свой файл в пэйнте 24 разрядный, скопировало нормально. А до этого я открывал файл jpeg в фотошопе и пэйнте и сохранял его как 16,256 цветный, 24 разрядный bmp, копирует криво только 24разрядный. Правда не имею никаких идей из за чего этого могло произойти.

Последний раз редактировалось Lavandil; 26.11.2012 в 02:09.
Lavandil вне форума Ответить с цитированием
Старый 26.11.2012, 02:10   #7
crymchanin
Пользователь
 
Аватар для crymchanin
 
Регистрация: 01.02.2012
Сообщений: 84
По умолчанию

Порядок чтения из файла (24 бит):
BITMAPFILEHEADER
BITMAPINFOHEADER
Массив RGB

В RGBQUAD из структуры BITMAPINFO заносится карта цветов. В 24 битном изображении ее нет.

Последний раз редактировалось crymchanin; 26.11.2012 в 02:13.
crymchanin вне форума Ответить с цитированием
Старый 26.11.2012, 02:26   #8
crymchanin
Пользователь
 
Аватар для crymchanin
 
Регистрация: 01.02.2012
Сообщений: 84
По умолчанию

Код:
FILE* f;
BITMAPFILEHEADER bfh;
BITMAPINFOHEADER bih;
DWORD sz;
BYTE* rgb;

f = fopen("pict.bmp", "rb");
fread(&bfh, sizeof(BITMAPFILEHEADER), 1, f);
fread(&bih, sizeof(BITMAPINFOHEADER), 1, f);
sz = bih.biWidth * bih.biHeight * 3;
rgb = new BYTE[sz];
fread(rgb, sz, 1, f);
crymchanin вне форума Ответить с цитированием
Старый 26.11.2012, 03:35   #9
Lavandil
Новичок
Джуниор
 
Регистрация: 25.11.2012
Сообщений: 6
Подмигивание

Цитата:
#include "stdafx.h"
#include <stdio.h>
#include <io.h>
#include <fcntl.h>
#include <sys\stat.h>
#include <windows.h>
#include <errno.h>

int main(int argc, char* argv[])
{
FILE* f, *f1;
BITMAPFILEHEADER bfh;
BITMAPINFOHEADER bih;
DWORD sz;
BYTE* rgb;

f=fopen("r1.bmp", "rb");
fread(&bfh, sizeof(BITMAPFILEHEADER), 1, f);
fread(&bih, sizeof(BITMAPINFOHEADER), 1, f);
sz = bih.biWidth * bih.biHeight * 3;
rgb = new BYTE[sz];
fread(rgb, sz, 1, f);

f1 = fopen("r3.bmp", "w");
fwrite(&bfh, sizeof(BITMAPFILEHEADER), 1, f1);
fwrite(&bih, sizeof(BITMAPINFOHEADER), 1, f1);
fwrite(rgb, sz, 1, f1);
fclose(f);
fclose(f);
return 0;
}
НЛО копирует правильно, а с пейзажем результат все тот же - рисунки в архиве, можете сами попробовать.

P.S. Прикрепил еще bmp с котом, которого тоже скачал из нета в формате jpeg,а потом конвертировал в 24 bmp в paint
Вложения
Тип файла: rar Pics.rar (2.72 Мб, 10 просмотров)

Последний раз редактировалось Lavandil; 26.11.2012 в 03:57.
Lavandil вне форума Ответить с цитированием
Старый 26.11.2012, 09:14   #10
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Открывайте второй файл в двоичном режиме...
f1 = fopen("r3.bmp", "w");
f1 = fopen("r3.bmp", "wb");
waleri на форуме Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Наложить BMP на BMP. sergeyrulit Общие вопросы Delphi 6 05.03.2015 13:41
BMP GonzA C# (си шарп) 0 13.06.2012 08:25
bmp Ципихович Эндрю Свободное общение 10 01.04.2012 20:55
Загрузка BMP в Simple Graph и сохранение в BMP формат artemavd Общие вопросы Delphi 10 02.10.2010 14:19