2013-04-18 4 views
2

Доброе утро,Значение альфы не сохраняется при сохранении растрового изображения

Я делаю изображение Стеганографический проект для колледжа. Скрывая данные на изображении. Я пишу «Длина текста», которая является Int32 в пикселе. Поскольку Int32 имеет 4 байта. Я думал, что могу записать его в 4 байтах Alpha, Red, Green, Blue, так как каждый цвет имеет 1 байт. Затем я сохраняю изображение в формате BMP. Я использовал один шаг и данные правильно распределены и заданы в пикселе.

Проблема возникает, когда я читаю пиксель. R, G, B имеют свою ценность, поскольку я их установил. Но альфа всегда 255 независимо от того, что она была установлена.

код, который я использую для распределения Int32 в 4 байта являются

byte R, G, B, A; 
int colorValue = messageLength; 
int first = colorValue & 255; 
//R contains bit 0-7 means the least significant 8 bits 
R = (byte)first; 
colorValue = colorValue - first; 
int second = colorValue & 65535; 
colorValue = colorValue - second; 
second = second >> 8; 
//G contains 8-15 
G = (byte)second; 
int third = colorValue & 16777215; 
colorValue = colorValue - third; 
third = third >> 16; 
//B contains 16-23 
B = (byte)third; 
colorValue = colorValue >> 24; 
//A contains 24-31 
A = (byte)colorValue; 
pixelColor = Color.FromArgb(A, R, G, B); 
bitmap.SetPixel(location.X, location.Y, pixelColor); 

Код для получения значений спина

byte R, G, B, A; 
R = pixelColor.R; 
G = pixelColor.G; 
B = pixelColor.B; 
A = pixelColor.A; 

messageLength = A; 
messageLength = messageLength << 8; 
messageLength += B; 
messageLength = messageLength << 8; 
messageLength += G; 
messageLength = messageLength << 8; 
messageLength += R; 

Есть ли что-то мне не хватает. Разве BMP не позволяет сохранять альфа-значение? Пожалуйста, помогите. Спасибо.

+0

Трудно диагностировать проблему, не видя кода, который вы используете для написания и чтения растрового изображения. Можете ли вы опубликовать это? –

+0

Не уверен, следовательно, комментарий, но вам не понадобится что-то вроде «PNG» для хранения значений альфа? – npinti

+0

Кажется, это невозможно. Возможно [используйте PNG] (http://msdn.microsoft.com/en-us/library/aa970062 (v = vs.100) .aspx)? –

ответ

1

Извините, что Bitmap не поддерживает альфа-значение.

+1

Если вы немного нажмете на ссылку, вы найдете [_ «Высокий байт в каждом DWORD не используется» _] (http://msdn.microsoft.com/en-us/library/dd183376% 28VS.85% 29.aspx) и [_ "API Windows не способен генерировать изображения BMP с альфа-информацией, и очень мало программ редактирования графики могут сохранять прозрачность при сохранении изображений в виде файлов BMP." _] (Https://github.com/thomerow/png2bmp32). Таким образом, хотя технически может быть возможно использовать все четыре байта для хранения альфа-канала, это не может быть сделано с использованием механизма .NET для сохранения растровых изображений. – CodeCaster

+1

Спасибо за разъяснение. Формат BMP технически может, но класс Bitmap на самом деле не может. Mistook Bitmap для BMP. Мои извинения. Я всегда использовал PNG в прошлом, когда мне нужно было использовать альфа-значения. –

+0

@ChrisMantle, но библиотеки, с которыми вы связались в своем (теперь удаленном) комментарии ** do **, позволяют пользователю писать неиспользуемый неиспользуемый байт. Идеально подходит для скрытия информации, как хочет OP. Если эти файлы не должны быть открытыми и безопасными для других редакторов, поскольку они уничтожат скрытые данные. – CodeCaster

Смежные вопросы