#java #image #corruption
#java #изображение #повреждение
Вопрос:
Я пытаюсь намеренно испортить входное изображение.
BufferedImage bImage = ImageIO.read(new File("input.jpg"));
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ImageIO.write(bImage, "jpg", bos);
byte[] data = bos.toByteArray();
for (int x = 0; x < bImage.getHeight(); x ) {
int yesNo = (int) Math.round(Math.random());
int r = (int) (Math.random() * 255);
int g = (int) (Math.random() * 255);
int b = (int) (Math.random() * 255);
Color myColor = new Color(r, g, b);
if (yesNo == 1) {
data[x] = (byte) myColor.getRGB();
}
}
ByteArrayInputStream bis = new ByteArrayInputStream(data);
BufferedImage bImage2 = ImageIO.read(bis);
ImageIO.write(bImage2, "jpg", new File("output.jpg"));
Когда я преобразую свое изображение в массив байтов и изменяю значения, оно иногда выдает серые пиксели вместо рандомизированных цветных. Вот мои входные и выходные данные (мой друг предложил изображение, а не я).
входное изображение и выходное изображение
Я также провел некоторое исследование и обнаружил, что если я открою файл в шестнадцатеричном редакторе и произвольно изменю значения, это даст мне желаемый результат. Может быть, я мог бы каким-то образом воспроизвести это в java? (желаемое изображение. Не возражал бы, если бы это было более запутанным.)
Комментарии:
1. Похоже, что вместо того, чтобы пытаться повредить изображение, вы на самом деле хотите повредить двоичный файл?
2. @phflack пока выходной файл jpg или png испорчен, для меня это не имеет значения.
3. Это зависит от того, какого рода изменений вы ожидаете, если вы пытаетесь изменить случайные пиксели на новые значения, я подозреваю, что вы хотите использовать BufferedImage для внесения изменений. Ваш текущий код, вероятно, читает необработанный файл и вносит изменения в метаданные
4. Разве это не то, к чему приводит изменение шестнадцатеричных значений?
5. Обычно файлы изображений сжимаются, и в начале обычно содержатся данные об остальной части файла. Если вы будете возиться с этим, могут произойти неожиданные вещи. Если это то, к чему вы стремитесь, вместо того, чтобы возиться с
(byte)Color.getRGB()
, может быть, вам следует просто использоватьRandom.nextByte()
? В настоящее время вы создаете 24-битное число, а затем берете последние 8 бит (иначе зеленое значение)
Ответ №1:
вместо этого вам следует использовать формат «png»
Комментарии:
1. В буферизованном изображении используется jpg, а не pngs.
2. @unprotested BufferedImage будет записывать в любом формате, который вы ему укажете, я использую его для записи png
3. @unprotested вы ошибаетесь, я использовал его без каких-либо проблем
4. @phflack Я изменил JPG на PNG, и это выдало мне эту ошибку: Исключение IOException: javax.imageio. Исключение IIOException: не удается прочитать входной файл!
5. @unprotested О, только сейчас понял, что вы изменили чтение, а также запись. Если вы попытаетесь прочитать .jpg как .png, это приведет к сбоям, потому что это разные форматы. Вы должны быть в состоянии без проблем записать
BufferedImage
в формате .png, продолжая читать .jpg как .jpg