Теперь, когда я изменил свое декодирование и кодировку на основе ответа here, я не могу заставить свой dataComparison
работать. Я пробовал применять линии декодирования, которые вы указали, но я не могу получить закодированные данные на картинке.Я не могу исправить декодирование после изменения некоторых строк
Это оригинал dataComparison
который работал с использованием моего первоначального кода кодирования/декодирования.
dataComparison
как декодирование, но он декодирует 2 файла (которые были созданы моей стеганографией) и сравнивает их. gui.appendStatus()
Нижеприведенные вызовы запрашивают данные, которые были извлечены.
for(int i = 0; i < height; i++){
for(int j = 0; j < width; j++){
Color c = new Color(image.getRGB(j, i));
Color c2 = new Color(image2.getRGB(j, i));
lossyData += getLSB(integerToBinary((int)(c.getRed())),lsb);
lossyData += getLSB(integerToBinary((int)(c.getGreen())),lsb);
lossyData += getLSB(integerToBinary((int)(c.getBlue())),lsb);
losslessData += getLSB(integerToBinary((int)(c2.getRed())),lsb);
losslessData += getLSB(integerToBinary((int)(c2.getGreen())),lsb);
losslessData += getLSB(integerToBinary((int)(c2.getBlue())),lsb);
cLossyData[i][j][0] = c.getRed();
cLossyData[i][j][1] = c.getGreen();
cLossyData[i][j][2] = c.getBlue();
cLosslessData[i][j][0] = c2.getRed();
cLosslessData[i][j][1] = c2.getGreen();
cLosslessData[i][j][2] = c2.getBlue();
if(limit >= 8 * lsb){
break;
}
}
}
int counter = 0;
while(counter * 8 < losslessData.length()){
int index = counter * 8;
String str = lossyData.substring(index, index + 8);
String str2 = losslessData.substring(index, index + 8);
lyData += str;
lsData += str2;
if(!str2.equals("00000000")){
lossyMessage += new Character((char)Integer.parseInt(str, 2)).toString();
losslessMessage += new Character((char)Integer.parseInt(str2, 2)).toString();
counter++;
}
else{
lyData = lyData.substring(0,lyData.length()-8);
lsData = lsData.substring(0,lsData.length()-8);
break;
}
}
int i = 0, lostBits = 0;
while(i < lyData.length()){
if(lyData.charAt(i) != lsData.charAt(i)){
lostBits++;
}
i++;
}
gui.appendStatus("Data decoded was (Lossless):\n\"" + lsData + "\".");
gui.appendStatus("Data decoded was (Lossy):\n\"" + lyData + "\".");
gui.appendStatus("Number of lsb: " + lsb);
gui.appendStatus("Number of bits (hidden message): " + counter * 8);
gui.appendStatus("Number of lost bits (hidden message): " + lostBits);
float z = ((lostBits*100)/(counter*8));
String percentage = String.format("%.04f", z);
gui.appendStatus("Percentage of lost bits (hidden message): " + percentage + "%");
gui.appendStatus("Message decoded was (Lossless): \"" + losslessMessage + "\".");
gui.appendStatus("Message decoded was (Lossy): \"" + lossyMessage + "\".");
gui.appendStatus("Number of characters: " + counter);
int counterR = 0, counterG = 0, counterB = 0;
for(int p = 0; p < height; p++){
for(int q = 0; q < width; q++){
if(cLosslessData[p][q][0] != cLossyData[p][q][0]){
counterR++;
}
else if(cLosslessData[p][q][1] != cLossyData[p][q][1]){
counterG++;
}
else if(cLosslessData[p][q][2] != cLossyData[p][q][2]){
counterB++;
}
}
}
gui.appendStatus("Total RGB values: " + width * height * 3);
gui.appendStatus("Altered Red values: " + counterR);
gui.appendStatus("Altered Green values: " + counterG);
gui.appendStatus("Altered Blue values: " + counterB);
gui.appendStatus("Total Altered values: " + (counterR + counterG + counterB));
z = ((counterR + counterG + counterB)*10000)/(width * height * 3);
percentage = String.format("%.02f", z/100);
gui.appendStatus("Percentage Altered values: " + percentage + "%");
Код, указанный выше, был основан на моем первоначальном алгоритме кодирования/декодирования. Тот, который не останавливает цикл. Я пробовал редактировать код и применять новый алгоритм декодирования, но я не могу заставить его работать.
Что нужно сделать, чтобы заставить его работать?
РЕДАКТИРОВАТЬ
я удалил некоторые отвратительные коды и включены только dataComparison
. То, что я удалил, доступно по ссылке (мой предыдущий вопрос)
Вот мой блок dataComparison
, который был изменен на основе ответа Reti43, который не работает с новой кодировкой. Я не могу расшифровать закодированное сообщение здесь с помощью dataComparison
decoding1:
for(int i = 0; i < height; i++){
for(int j = 0; j < width; j++){
Color c = new Color(image.getRGB(j, i));
lossyData += getLSB(integerToBinary((int)(c.getRed())),lsb);
if(limit >= 8) break decoding1;
lossyData += getLSB(integerToBinary((int)(c.getGreen())),lsb);
if(limit >= 8) break decoding1;
lossyData += getLSB(integerToBinary((int)(c.getBlue())),lsb);
if(limit >= 8) break decoding1;
}
}
decoding2:
for(int i = 0; i < height; i++){
for(int j = 0; j < width; j++){
Color c = new Color(image.getRGB(j, i));
losslessData += getLSB(integerToBinary((int)(c.getRed())),lsb);
if(limit >= 8) break decoding2;
losslessData += getLSB(integerToBinary((int)(c.getGreen())),lsb);
if(limit >= 8) break decoding2;
losslessData += getLSB(integerToBinary((int)(c.getBlue())),lsb);
if(limit >= 8) break decoding2;
}
}
decoding3:
for(int i = 0; i < height; i++){
for(int j = 0; j < width; j++){
Color c = new Color(image.getRGB(j, i));
cLossyData[i][j][0] = c.getRed();
if(limit >= 8) break decoding3;
cLossyData[i][j][1] = c.getGreen();
if(limit >= 8) break decoding3;
cLossyData[i][j][2] = c.getBlue();
if(limit >= 8) break decoding3;
}
}
decoding4:
for(int i = 0; i < height; i++){
for(int j = 0; j < width; j++){
Color c = new Color(image.getRGB(j, i));
cLosslessData[i][j][0] = c.getRed();
if(limit >= 8) break decoding4;
cLosslessData[i][j][1] = c.getGreen();
if(limit >= 8) break decoding4;
cLosslessData[i][j][2] = c.getBlue();
if(limit >= 8) break decoding4;
}
}
for (int index = 0; index < lossyData.length()/8; index++) {
String str = lossyData.substring(8*index, 8*index+8);
lyData += str;
lossyMessage += new Character((char)Integer.parseInt(str, 2)).toString();
}
for (int index = 0; index < losslessData.length()/8; index++) {
String str = losslessData.substring(8*index, 8*index+8);
lsData += str;
losslessMessage += new Character((char)Integer.parseInt(str, 2)).toString();
}
int i = 0, lostBits = 0;
while(i < lyData.length()){
if(lyData.charAt(i) != lsData.charAt(i)){
lostBits++;
}
i++;
}
int counter = losslessMessage.length();
gui.appendStatus2("Data decoded was (Lossless):\n\"" + losslessData + "\".");
gui.appendStatus2("Data decoded was (Lossy):\n\"" + lyData + "\".");
gui.appendStatus2("Number of lsb: " + lsb);
gui.appendStatus2("Number of bits (hidden message): " + counter * 8);
gui.appendStatus2("Number of lost bits (hidden message): " + lostBits);
float z = ((lostBits*100)/(counter*8));
String percentage = String.format("%.04f", z);
gui.appendStatus2("Percentage of lost bits (hidden message): " + percentage + "%");
gui.appendStatus2("Message decoded was (Lossless): \"" + losslessMessage + "\".");
gui.appendStatus2("Message decoded was (Lossy): \"" + lossyMessage + "\".");
gui.appendStatus2("Number of characters: " + counter);
int counterR = 0, counterG = 0, counterB = 0;
for(int p = 0; p < height; p++){
for(int q = 0; q < width; q++){
if(cLosslessData[p][q][0] != cLossyData[p][q][0]){
counterR++;
}
else if(cLosslessData[p][q][1] != cLossyData[p][q][1]){
counterG++;
}
else if(cLosslessData[p][q][2] != cLossyData[p][q][2]){
counterB++;
}
}
}
gui.appendStatus2("Total RGB values: " + width * height * 3);
gui.appendStatus2("Altered Red values: " + counterR);
gui.appendStatus2("Altered Green values: " + counterG);
gui.appendStatus2("Altered Blue values: " + counterB);
gui.appendStatus2("Total Altered values: " + (counterR + counterG + counterB));
z = ((counterR + counterG + counterB)*10000)/(width * height * 3);
percentage = String.format("%.02f", z/100);
gui.appendStatus2("Percentage Altered values: " + percentage + "%");
Thats много кода .... http: //stackoverflow.com/help/mcve –
Мне нужно было показать исходное кодирование/декодирование, скорректированное кодирование/декодирование и сопоставление данных. Чтобы узнать, в чем причина, из-за которой он терпит неудачу. – InnZaayynn
Это дамп кода, и он даже не предоставляет всю необходимую информацию для репликации вашей проблемы. Что значит * это не работает *? Вы говорите, что это сработало раньше. С каким изображением какое сообщение, какое значение 'numLSB'? Вы пробовали те же самые после модификаций? Если нет, какие файлы/переменные вы использовали? Какой у вас результат? Чего ты ожидал? Ваш 'dataCompresion' очень похож на последовательность декодирования. Вы применяли те же самые изменения? Вы уверены, что сделали это правильно? Мы можем это увидеть? Покажите все попытки, предпринятые вами при решении проблемы, даже если они не работают. – Reti43