Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/34: Рейтинг темы: голосов - 34, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 23.02.2013
Сообщений: 6
1

Алгоритм RLE для сжатия изображения

12.01.2014, 12:13. Показов 6120. Ответов 5
Метки нет (Все метки)

Буду очень признателен в помощи в решении данного вопроса.
Начал с того, что сохраняю изображение в массив байт:
Java
1
2
3
4
5
6
7
8
9
10
11
File f = new File("image.jpg");
BufferedImage img = ImageIO.read(f);
        
int w = img.getWidth();
int h = img.getHeight();
        
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(img, "jpg", baos);
baos.flush();
byte[] imageInByte = baos.toByteArray();
baos.close();
Но теперь не понимаю что делать с этим массивом... На сколько я понимаю, в массиве байт теперь нужно найти повторяющиеся цепочки значений и их длину. Но за счет чего изображение станет меньше по "весу" после применения алгоритма? Ведь после декодирования получится, по сути, исходный массив, и если сохранить из этих данных изображение, оно получится таким же? Подскажите пожалуйста, в чем заключается именно сжатие. Если у кого-то есть реализация на Java, поделитесь пожалуйста.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.01.2014, 12:13
Ответы с готовыми решениями:

Алгоритм сжатия RLE
Здравствуйте, очень нужна помощь в задании! Просто очень срочно, пожалуйста! Написать программу...

Алгоритм сжатия RLE. От этого зависит зачет по предмету)
Напишите программу, которая: 1. будет считывать с клавиатуры раздельно (через Enter) вводимую ...

Мне нужно в программе, метки заменить на цикл(программа реализации сжатия информации алгоритм RLE)
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics,...

Алгоритм сжатия изображения JPEG в Mathcad
Если у кого есть возможность или листинг как этот алгоритм реализовать!! Помогите пожалуйста

5
2582 / 2255 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
12.01.2014, 12:48 2
может просто сохраните в png или bmp и не будете писать велосипед, а за вас покодируют стандартные либки?

ваш код вверху кстати уже сохранил в сжатии jpeg, вы его хотите дожать дальше?
0
0 / 0 / 0
Регистрация: 23.02.2013
Сообщений: 6
12.01.2014, 13:36  [ТС] 3
Цитата Сообщение от mutagen Посмотреть сообщение
может просто сохраните в png или bmp и не будете писать велосипед, а за вас покодируют стандартные либки?

ваш код вверху кстати уже сохранил в сжатии jpeg, вы его хотите дожать дальше?
Мне нужно реализовать сжатие изображения по алгоритму RLE.
0
0 / 0 / 0
Регистрация: 25.12.2013
Сообщений: 6
12.01.2014, 19:33 4
>>Мне нужно реализовать сжатие изображения по алгоритму RLE.
Но у тебя исходный файл jpg. Он уже сильно сжат, применять к нему RLE не имеет смысла. Так что сперва тебе придётся его разжать. Если твоя цель именно изучить формат, то сперва тебе нужно поработать с чем-то попроще. Например, разберись, как устроен bmp (инфу несложно найти в сети), затем изучи алгоритм RLE, а потом уже садись за написание программы, которая ужмёт BMP по алгоритму RLE. Если тебе действительно интересна эта тема, глянь, например, статью "Изображения: форматы и сжатие" на Хабре.

Если же тебе важен только результат (конвертация изображения из одного формата в другой), используй библиотеки: стандартные или сторонние.
0
0 / 0 / 0
Регистрация: 23.02.2013
Сообщений: 6
12.01.2014, 20:20  [ТС] 5
Цитата Сообщение от Ix Didicus Посмотреть сообщение
>>Мне нужно реализовать сжатие изображения по алгоритму RLE.
Но у тебя исходный файл jpg. Он уже сильно сжат, применять к нему RLE не имеет смысла. Так что сперва тебе придётся его разжать. Если твоя цель именно изучить формат, то сперва тебе нужно поработать с чем-то попроще. Например, разберись, как устроен bmp (инфу несложно найти в сети), затем изучи алгоритм RLE, а потом уже садись за написание программы, которая ужмёт BMP по алгоритму RLE. Если тебе действительно интересна эта тема, глянь, например, статью "Изображения: форматы и сжатие" на Хабре.

Если же тебе важен только результат (конвертация изображения из одного формата в другой), используй библиотеки: стандартные или сторонние.
Спасибо за ответ, учту насчет bmp. И все же, сколько инфы перелопатил, так и не понял сути: вот возьму я картинку, пусть в bmp формате. считаю ее в массив байт, к этому массиву применю RLE и из полученного массива опять сделаю картинку, в следствии чего получу ужатое изображение? то есть будет ли полученное изображение похоже на исходное, или в следствии кодирования выходное изображение будет грубо говоря "цветной кашей", из которой можно восстановить исходное изображение?
0
0 / 0 / 0
Регистрация: 23.02.2013
Сообщений: 6
16.01.2014, 18:28  [ТС] 6
Вот нашел на просторах интернета следующий код, может кому еще пригодится:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
 
public class RLE {
 
    public void compress(String source, String dis) {
        try {
            FileInputStream in = new FileInputStream(source);
            FileOutputStream out = new FileOutputStream(dis);
            int next = 0;
            int count = in.read();  
            while ((next = in.read()) >= 0) {
                int counter = 1;
                if (count == next) {
                    counter++;
                    while (next == (count = in.read())) {
                        counter++;
                    }
                    while (counter >= 63) {     // ???
                        out.write(255);      // ???
                        out.write(next);
                        //System.out.println((0xc0 + 63) + " " + count);
                        counter -= 63;
                    }
                    if (counter > 1) { 
                        out.write(0xc0 + counter);      // ???
                        out.write(next);
                        //System.out.println((0xc0 + counter) + " " + counter);
                    }
                } else {
                    if (count <= 0xc0) {      // ???
                        //System.out.println(count);
                        out.write(count);
                        count = next;
                    } else {
                        out.write(0xc1);      // ???
                        out.write(count);
                        count = next;
                        //System.out.println((0xc1) + count);
                    }
                }
            }
            if (count <= 0xc0) {      // ???
                //System.out.println(count);
                out.write(count);
            } else {
                out.write(0xc1);
                out.write(count);
                //System.out.println((0xc1) + count);
            }
            in.close();
            out.close();
        } catch (IOException e) {
        }
    }
 
    public void decompress(String source, String dis) {
        try {
            FileInputStream in = new FileInputStream(source);
            FileOutputStream out = new FileOutputStream(dis);
            int count = 0;
            while ((count = in.read()) >= 0) {
                if (count == 0xc1) {
                    out.write(in.read());
                } else if (count <= 0xc0) {
                    out.write(count);
                } else if (count > 0xc1) {
                    int next = in.read();
                    for (int i = 0; i < (count - 0xc0); i++) {
                        out.write(next);
                    }
                }
            }
        } catch (Exception e) {
        }
    }
 
    public static void main(String[] args) {
        new RLE().compress("input.bmp", "compressed.rle");
        new RLE().decompress("compressed.rle", "output.bmp");
    }
}
Он выполняет именно то, что мне было нужно, только не все в нем для меня ясно, а хотелось бы разобраться. Подскажите, что происходит в куске:
Java
1
2
3
4
5
6
7
    
                    while (counter >= 63) {
                        out.write(255);
                        out.write(next);
                        //System.out.println((0xc0 + 63) + " " + count);
                        counter -= 63;
                    }
Почему в цикле именно 63, и что такое 0xc0 и 0xc1 в коде
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.01.2014, 18:28

Метод сжатия RLE
Помогите написать программу для сжатия данных методом RLE. Чтобы через встроенную граф.систему...

Не работает программа сжатия RLE
Не работает программа сжатия текста RLE program Project2; {$APPTYPE CONSOLE} uses ...

Реализация метода сжатия rle
реализовать метод сжатия rle для изображения с помощью библиотеки Pillow

Написать программу кодировки (сжатия) цифр алгоритмом RLE
Нужно написать программу кодировки(сжатия) цифр алгоритмом RLE. Есть пример но он кодиркет не так...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru