áááá«ááºáž
áá±áá¹áá¬ááŸáá·áºááŒá¬ážááá¯ááºáá«áá
áááŒá¬áá±ážáá®á ááá¹áááá¯ááºááœáẠááá¬áááºááŒá¬ážáá±á
áẠâááááºážá¡áá»ááºá¡ááẠáá¯á¶ááŒá¯á¶áá±ážááá¯ááºáᬠáá±á¬á·ááºáá²ááºáááºážáááºážáá»á¬ážâ ááœáẠáááºáááºážáá
áºáá¯ááŸááá²á·áá«áááºá áá¬áááºá GIF ááá¯ááºáá»á¬ážááœáẠáááºáá±á·áá»áºááá·áºááá·áº áááá¯ááááºáá
áºáá¯ááᯠáááºáá®ážááẠáá»áœááºá¯ááºááá¯á·ááᯠááá¯á¡ááºáááºá Java ááŸá¬áá¯ááºááá¯á·áá¯á¶ážááŒááºááá¯ááºáááºá
áá®áá±á¬ááºážáá«ážááŸá¬ áá®á¡áá¯áá®ááá¯ááºáᬠá¡áá»ááºá¡áá»áá¯á·á¡ááŒáẠáá®áááá¯ááááºáá±ážááᯠáááºááá¯áááºáá®ážáá²á·ááá²ááá¯áá¬ááᯠáá±á¬áºááŒáá«áááºá
á¡ááá¯áá«áá®á¡áá¯áá®áá áºá áááºáá áºááá¯ááºáž
GIF áá±á¬áºáááº
GIF (ááááºáá áºáááŸááºááŸá¯áá±á¬áºááẠ- áá¯á¶áá»á¬ážáááŸááºááá·áºáá±á¬áºáááº) ááẠá¡áá±á¬áẠ256 áá±á¬ááºá¡áá áá±á¬áºáááºááŒáá·áº á¡áááºá¡ááœá±ážááá¯á¶ážááŸá¯á¶ážáá² áá»á¯á¶á·áá¬ážáá±á¬áá±áá¬ááᯠááááºážáááºážááá¯ááºááá·áº ááááºáá áºáá¯á¶áá»á¬ážááᯠááááºážáááºážáááºá¡ááœáẠáá±á¬áºáááºáá áºáá¯ááŒá áºáááºá á€áá±á¬áºáááºááᯠ1987 (GIF87a) ááœáẠCompuServe á០ááœááºáááºáá»á¬ážáá±á«áºááœáẠraster áá¯á¶áá»á¬ážááᯠáá¯ááºááœáŸáá·áºáááºá¡ááœáẠáá®ááœááºáá²á·áááºá 1989 áá¯ááŸá áºááœááºá áá±á¬áºááẠ(GIF89a) ááᯠááœááºážáá¶áá²á·ááŒá®ážá ááœáá·áºáááºážááŒááºáá¬ááŸá¯ááŸáá·áº áá¬ááœááºážá¡ááœáẠáá¶á·ááá¯ážááŸá¯ááᯠááá·áºááœááºážáá²á·áááºá
GIF ááá¯ááºáá»á¬ážááœáẠááááºááá¯á·ááœá²á·á ááºážáá¯á¶ ááŸááááºá á€ááá±á¬ááºáá»á¬ážááẠáá¯á¶áá±á¡ááŸááºáá áºáá¯á¡ááŒá²ááŸááá«ááẠ(ááá¯á·ááá¯áẠá¡áá»áá¯á·áá±á¬á¡áá¶áá»á¬ážáá±á«áºááœááºáá°áááºáááº) ááá¯á·ááŒá±á¬áá·áº ááá±á¬ááºáá áºáá¯á á®áááºááŸáááá·áºáá±áá¬ááŸáá·áºáááºáááºá á¡ááŸá¬ážáá¯ááºáááºáááŒá áºááá¯ááºáá±á GIF89a áá±á¬áºáááºááŸá á¡ááá¯ážááŸááºážáá¯á¶áž áá¬ááœááºážááá¯ááºáá±á¬ GIF áá¯ááºáá¯á¶á ááœá²á·á ááºážáá¯á¶-
ááœá²á·á
ááºážáááºáá±á¬ááºáá¯á¶áá¯á¶ážáá»á¬ážá¡á¬ážáá¯á¶ážá á€á¡ááŒá±á¡áá±ááœááºá áá»áœááºá¯ááºááá¯á·ááẠááá¹áá¬áá¯á¶ážááá¯ááºáᬠáá»ááºáá»ááºáá¯á¶ážááŸáá·áº palette á¡ááœáẠáá¬áááºááŸááá±á¬ áá±á¬ááºáá»á¬ážááᯠá
áááºáááºá
á¬ážáá«áááº-
CT
- ááá¹áá¬áá¯á¶ážááá¯ááºáᬠáá»ááºáá»ááºáá áºáᯠááŸááá±ááŒááºážá á€á¡áá¶ááᯠáááºááŸááºáá«áá ááá¹áá¬áá¯á¶ážááá¯ááºáᬠpalette ááẠáá¯áá¹áááááºáá¬ážááŒáẠááá¯ááºááœááºááŒá®ážáá±á¬áẠáá»ááºáá»ááºážá áááºááá«áááºáSize
- áá¯á¶ááœááºáá«ááŸááá±á¬á¡áá±á¬ááºáá»á¬ážááŸáá·áº palette á¡ááœááºá¡á á¬ážá á€ááá·áºáááºáá»ááºá¡ááœáẠáááºááá¯ážáá»á¬áž-
á¡ááœááº
á¡áá±á¬ááºá¡áá±á¡ááœááº
áá»ááºáá»ááºá¡ááœááºá¡á
á¬ážá ááá¯ááºáá»á¬áž
7
256
768
6
128
384
5
64
192
4
32
96
3
16
48
2
8
24
1
4
12
0
2
6
áá¯ááºááŸááºáááºážáá»á¬áž
áá¯á¶ááá¯ááºáá»á¬ážááœáẠá á¬ááŸááºááẠá¡á±á¬ááºáá«áááºážáááºážáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯áá«áááºá
- LSB (Least Significant Bit) áááºážáááºáž
- Palette áá±á«ááºážááá·áºáááºáž
LSB áááºážáááºáž - áá±áá°áá»áá¯á¶áá±áááºážá áááºážááœáẠááœááºááááºáá¬ááŸá áá±á¬ááºáá¯á¶ážáááá¬áááºááŸá¬ážáá±á¬ bit áá»á¬áž (áá»áœááºá¯ááºááá¯á·ááá á¹á ááœááºá ááá¹áá¬áá¯á¶ážááá¯ááºáᬠpalette bytes) ááᯠááŸááºáá¬ážáá±á¬á á¬á bits áá»á¬ážááŒáá·áº á¡á á¬ážááá¯ážááŒááºáž áá«áááºáááºá
áááá¯ááááºááẠá€áááºážáááºážá áá áºá áááºáá áºááá¯ááºážá¡ááŒá Ạááá¹áá¬áá¯á¶ážááá¯ááºáᬠpalette bytes á¡ááœááºážááŸá áá±á¬ááºáá¯á¶ážáá áºááŸá áºáá¯ááᯠá¡áá¯á¶ážááŒá¯áááºááŒá áºáááºá ááá¯ááá¯áááºááŸá¬ 24-bit áá¯ááºáá¯á¶áá áºáá¯á¶á¡ááœáẠpalette á¡áá±á¬ááºááẠá¡áá®á á¡ááŒá¬ááŸáá·áº á¡á áááºážá¡ááœáẠáá¯á¶ážááá¯ááºááŸááá¬á áááºážááœáẠáááºáá±á·áá»áºáá áºáá¯ááᯠááá·áºááœááºážááŒá®ážáá±á¬ááºá á¡áá±á¬ááºá¡á áááºá¡ááá¯ááºážáá áºáá¯á á®ááẠá¡áá»á¬ážáá¯á¶áž 3/255 á¡ááá·áºá¡áá ááŒá±á¬ááºážáá²ááœá¬ážáááºááŒá áºáááºá ááá¯ááá¯á·áá±á¬ááŒá±á¬ááºážáá²ááŸá¯ááᯠááááŠážá áœá¬ áá°áá¬ážáá»ááºá áááŒáá·áº áááŒááºááá¯ááºáá±á¬ ááá¯á·ááá¯áẠáááááŒá¯ááááẠáááºáá²áááºááŒá áºááŒá®ážá áá¯áááá¡áá»ááºááŸá¬ á¡áááºá¡ááœá±ážáááá·áºáá±á¬ ááááºážááœááºááŸááááááá¬áá»á¬ážááœáẠáááºážááᯠááŒááºááá¯ááºáááºááá¯ááºáá±á
á¡áá»ááºá¡áááºááá¬áááẠáá¯á¶ palette á á¡ááœááºá¡á á¬ážáá±á«áºááœáẠááá¯ááºááá¯ááºáá°áááºáá«áááºá áá»ááºáá»ááºá á¡ááŒáá·áºáá¯á¶ážá¡ááœááºá¡á á¬ážááŸá¬ á¡áá±á¬áẠ256 áá±á¬ááºááŒá áºááŒá®áž á¡áá±á¬ááºáá áºáá¯á á®á á¡á áááºá¡ááá¯ááºážáá áºáá¯á á®ááœáẠáááºáá±á·áá»áºááŸá áºáá¯ááᯠáá±ážáá¬ážáá«áá á¡ááŒáá·áºáá¯á¶ážáááºáá±á·ááºá»á¡ááŸáẠ(áá¯á¶ááœáẠá¡áá»á¬ážáá¯á¶áž palette áá«ááŸááá±á¬) ááẠ192 bytes ááŒá áºáááºá áááºáá±á·áá»áºááᯠáá¯á¶ááœáẠááá·áºááœááºážááŒá®ážáááºááŸáá·áºá ááá¯ááºá¡ááœááºá¡á á¬áž áááŒá±á¬ááºážáá²áá«á
Palette áá»á²á·áááºážGIF ááœá²á·á ááºážáá¯á¶á¡ááœááºáᬠá¡áá¯ááºáá¯ááºáááºá áá±ážáááºáá²á· palette áá«áá²á· áá¯á¶ááœá±áá±á«áºááŸá¬ á¡áááá±á¬ááºáá¯á¶ážááŒá áºáá«áááá·áºáááºá áááºážá á¡ááŸá áºáá¬áááŸá¬ áááºážááẠpalette á á¡ááœááºá¡á á¬ážááᯠááá¯ážá á±ááŒá®áž áá±á¬ááºá á¯á¶ááá¯ááºáá»á¬ážá¡á á¬áž ááá¯á¡ááºáá±á¬ ááá¯ááºáá»á¬ážááᯠáá±ážáá¬ážááẠáááºáá±á¬ááºážáá±áᬠáá±ážáá±á¬ááºáááŒááºáž ááŒá áºáááºá áá»ááºáá»ááºá á¡áááá·áºáá¯á¶ážá¡ááœááºá¡á á¬ážááẠá¡áá±á¬áẠ2 áá±á¬áẠ(6 bytes) áᯠáá°ááá«áá ááá·áºááœááºážáá¬ážáá±á¬ áááºáá±á·áá»áºá á¡áá»á¬ážáá¯á¶ážá¡ááœááºá¡á á¬ážááŸá¬ 256 à 3â6 = 762 bytes ááŒá áºááá¯ááºáá«áááºá á¡á¬ážáááºážáá»ááºááŸá¬ áá¯ááºááŸááºá áá Ạáá¯á¶ááŒá¯á¶ááŸá¯ áááºážáá«ážáááºá áááºáá±á·áá»áºááᯠáááºáá±á¬ááºáž áá¯ááºááŸááºááŒááºáž áááŒá¯áá«á áááºááá·áº á á¬áá¬ážáááºážááŒááºááŸá¯áááᯠá¡áá¯á¶ážááŒá¯á ááá·áºááœááºážáá¬ážáá±á¬ áááºáá±á·áá»áºááᯠáááºááá¯ááºáá«áááºá
áááºááœá±á·áá áºá áááºáá áºáá±á
á¡á á®á¡á ááºáá®ááá¯ááºáž
áá¯ááºááŸááºááŒááºážááŸáá·áº áá¯ááºááŸááºááŒááºážááá¯ááºáᬠá¡ááºáááá¯áá®áááºáá»á¬ážááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºáááºá¡ááœáẠááá¯á¡ááºáá±á¬áááááá¬áá»á¬ážá¡á¬ážáá¯á¶ážááᯠáááºáá±á·áá»áºááœáẠááá·áºááœááºážáá«áááºá com.tsarik.steganography
. á€á¡áá¯ááºááœáẠá¡ááºáá¬áá±á·á
áºáá«áááºáááºá Encryptor
áááºážáááºážáá»á¬ážááŒáá·áº encrypt
О decrypt
áá¡áááºáž Binary
bit arrays áá»á¬ážá¡ááŒáẠexception classes áá»á¬ážááŒáá·áº á¡áá¯ááºáá¯ááºááá¯ááºá
áœááºážááᯠáá¶á·ááá¯ážáá±ážáá±á¬á UnableToEncryptException
О UnableToDecryptException
á¡ááºáá¬áá±á·á
áºáááºážáááºážáá»á¬ážááœáẠá¡áá¯á¶ážááŒá¯ááá·áºáááºá Encryptor
encoding ááŸáá·áº decoding error á¡áá®ážáá®ážááŸááá»áŸááºá
áááºáá¡á
á®á¡á
ááºá¡áá¯áẠcom.tsarik.programs.gifed
static method ááŒáá·áº runnable program class áá
áºáᯠáá«áááºáááºá main
áááá¯ááááºááᯠrun áááºááœáá·áºááŒá¯áááºá áááá¯ááááºáá±á¬ááºáá»á¬ážááᯠááááºážáááºážááá·áº á¡áááºážá¡á
á¬ážá á¡ááŒá¬ážá¡áááºážáá»á¬ážááŸáá·áºá¡áá° packages áá»á¬ážá
á¡ááºáááá¯áá®áááºáá»á¬áž á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯ááᯠá¡áá¯ááºááœáẠáááºááŒáá«áááºá com.tsarik.programs.gifed.gif
á¡áááºážáá»á¬áž GIFEncryptorByLSBMethod
О GIFEncryptorByPaletteExtensionMethod
. á€á¡áááºážááŸá
áºáá¯á
áá¯á¶ážááẠinterface ááá¯á¡áá±á¬ááºá¡áááºáá±á¬áºáááá·áºáááºá Encryptor
.
GIF áá±á¬áºáááºá áááºáá±á¬ááºáá¯á¶á¡áá±á«áº á¡ááŒá±áá¶á áááºááẠáá¯ááºáá¯á¶ palette ááá¯á· áááºáá±á·áá»áºáá áºáá¯ááᯠááááºáááºáááºá¡ááœáẠáá±áá°áá» á¡ááºáááá¯áá®áááºáá áºáá¯ááᯠáááºáá®ážááá¯ááºáááº-
áá¯á¶áá
áºáá¯á¶ááœáẠáááºáá±á·áá»áºáá
áºáᯠááŸááá±ááŒááºážááᯠáá¯á¶ážááŒááºáááºá áá¯ááºáá«ááẠáŠážá
áœá¬áááºááŒá®áž ááŸááºáááºááŸá¯ ááŸááááŸá á
á
áºáá±ážáá±ážááá·áº áááºáá±á·áá»áºá á¡á
ááœáẠá¡áá»áá¯á·áá±á¬ á¡á
á®á¡á
á¥áºáá
áºáá¯ááᯠáá±á«ááºážááá·áºááẠááá¯á¡ááºáá«áááºá áááá¯ááºáá®áá«á áá¯á¶ááœáẠááŸááºáá¬ážáá±á¬ áááºáá±á·áá»áºáááŸááᯠáá°ááá«áááºá áá±á¬ááºáá
áºáá¯ááá±á¬á· áááºáá±á·ááºá»áá²á· á¡ááŸááºááᯠáááºááŸááºááá«áááºá á¡á²áá®á¡áá«ááŸá¬ áááºáá±á·ááºá»áá²á· á
á¬áá¬ážá áá°á·áá¬áá°á
á¡ááá®áá±ážááŸááºážáá áºáá¯áá¯á¶ážá Class diagram-
á¡á á®á¡á ááºááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááŒááºážá
áááá¯ááááºáá
áºáá¯áá¯á¶ážáá¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯ááᯠá¡á
áááºá¡ááá¯ááºážááŸá
áºáá¯á¡ááŒá
Ạááá¯ááºážááŒá¬ážááá¯ááºáááº- á¡ááºáá¬áá±á·á
áºáá¯ááºááŸááºááŒááºážááŸáá·áº á
á¬ááŸááºááŒááºážáááºážáááºážáá»á¬ážááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááŒááºážá Encryptor
á¡áááºážáá²ááœááºá GIFEncryptorByLSBMethod
О GIFEncryptorByPaletteExtensionMethod
ááŸáá·áº user interface áá¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯á
á¡áááºážááᯠáááºááŒááºáá«á GIFEncryptorByLSBMethod
.
Fields firstLSBit
О secondLSBit
áá¯á¶áá
áºáá¯á¶áá»ááºážá
á®á byte áá
áºáá¯á
á®á bits áá¶áá«ááºáá»á¬ážáá«ááŸáááŒá®áž áááºáá±á·áá»áºááá·áºááá·áºááá·áºáá±áá¬á០áááºáá±á·áá»áºááᯠáááºááá·áºáááºá áááºááœááºáž checkSequence
ááá·áºááœááºážáá¬ážáá±á¬ áááºáá±á·áá»áºááᯠá¡ááá¡ááŸááºááŒá¯ááŒá±á¬ááºáž áá±áá»á¬á
á±ááẠcheck bit sequence ááᯠááááºážáááºážáá«á á¡ááŒáááºáááºážáááºáž getEncryptingFileParameters
áááºááŸááºáá¬ážáá±á¬ááá¯ááºá ááá·áºáááºáá»ááºáá»á¬ážááŸáá·áº ááŒá
áºááá¯ááºáá»á±ááŸááá±á¬ áááºáá±á·áá»áºá áááá±áááá¹ááá¬áá»á¬ážááᯠááŒááºáá±ážáááºá
áááºážáááºáž algorithm encrypt
клаÑÑа GIFEncryptorByLSBMethod
:
ááŒá®ážáá±á¬á· áá°á·áá¯ááº
@Override
public void encrypt(File in, File out, String text) throws UnableToEncodeException, NullPointerException, IOException {
if (in == null) {
throw new NullPointerException("Input file is null");
}
if (out == null) {
throw new NullPointerException("Output file is null");
}
if (text == null) {
throw new NullPointerException("Text is null");
}
// read bytes from input file
byte[] bytes = new byte[(int)in.length()];
InputStream is = new FileInputStream(in);
is.read(bytes);
is.close();
// check format
if (!(new String(bytes, 0, 6)).equals("GIF89a")) {
throw new UnableToEncodeException("Input file has wrong GIF format");
}
// read palette size property from first three bits in the 10-th byte from the file
byte[] b10 = Binary.toBitArray(bytes[10]);
byte bsize = Binary.toByte(new byte[] {b10[0], b10[1], b10[2]});
// calculate color count and possible message length
int bOrigColorCount = (int)Math.pow(2, bsize+1);
int possibleMessageLength = bOrigColorCount*3/4;
int possibleTextLength = possibleMessageLength-2;// one byte for check and one byte for message length
if (possibleTextLength < text.length()) {
throw new UnableToEncodeException("Text is too big");
}
int n = 13;
// write check sequence
for (int i = 0; i < checkSequence.length/2; i++) {
byte[] ba = Binary.toBitArray(bytes[n]);
ba[firstLSBit] = checkSequence[2*i];
ba[secondLSBit] = checkSequence[2*i+1];
bytes[n] = Binary.toByte(ba);
n++;
}
// write text length
byte[] cl = Binary.toBitArray((byte)text.length());
for (int i = 0; i < cl.length/2; i++) {
byte[] ba = Binary.toBitArray(bytes[n]);
ba[firstLSBit] = cl[2*i];
ba[secondLSBit] = cl[2*i+1];
bytes[n] = Binary.toByte(ba);
n++;
}
// write message
byte[] textBytes = text.getBytes();
for (int i = 0; i < textBytes.length; i++) {
byte[] c = Binary.toBitArray(textBytes[i]);
for (int ci = 0; ci < c.length/2; ci++) {
byte[] ba = Binary.toBitArray(bytes[n]);
ba[firstLSBit] = c[2*ci];
ba[secondLSBit] = c[2*ci+1];
bytes[n] = Binary.toByte(ba);
n++;
}
}
// write output file
OutputStream os = new FileOutputStream(out);
os.write(bytes);
os.close();
}
áááºážáááºážá á¡ááºáááá¯áá®áááºááŸáá·áº á¡áááºážá¡ááŒá
áºáá¯áẠdecrypt
клаÑÑа GIFEncryptorByLSBMethod
:
@Override
public String decrypt(File in) throws UnableToDecodeException, NullPointerException, IOException {
if (in == null) {
throw new NullPointerException("Input file is null");
}
// read bytes from input file
byte[] bytes = new byte[(int)in.length()];
InputStream is = new FileInputStream(in);
is.read(bytes);
is.close();
// check format
if (!(new String(bytes, 0, 6)).equals("GIF89a")) {
throw new UnableToDecodeException("Input file has wrong GIF format");
}
// read palette size property from first three bits in the 10-th byte from the file
byte[] b10 = Binary.toBitArray(bytes[10]);
byte bsize = Binary.toByte(new byte[] {b10[0], b10[1], b10[2]});
// calculate color count and possible message length
int bOrigColorCount = (int)Math.pow(2, bsize+1);
int possibleMessageLength = bOrigColorCount*3/4;
int possibleTextLength = possibleMessageLength-2; // one byte for check and one byte for message length
int n = 13;
// read check sequence
byte[] csBits = new byte[checkSequence.length];
for (int i = 0; i < 4; i++) {
byte[] ba = Binary.toBitArray(bytes[n]);
csBits[2*i] = ba[firstLSBit];
csBits[2*i+1] = ba[secondLSBit];
n++;
}
byte cs = Binary.toByte(csBits);
if (cs != Binary.toByte(checkSequence)) {
throw new UnableToDecodeException("There is no encrypted message in the image (Check sequence is incorrect)");
}
// read text length
byte[] cl = new byte[8];
for (int i = 0; i < 4; i++) {
byte[] ba = Binary.toBitArray(bytes[n]);
cl[2*i] = ba[firstLSBit];
cl[2*i+1] = ba[secondLSBit];
n++;
}
byte textLength = Binary.toByte(cl);
if (textLength < 0) {
throw new UnableToDecodeException("Decoded text length is less than 0");
}
if (possibleTextLength < textLength) {
throw new UnableToDecodeException("There is no messages (Decoded message length (" + textLength + ") is less than Possible message length (" + possibleTextLength + "))");
}
// read text bits and make text bytes
byte[] bt = new byte[textLength];
for (int i = 0; i < bt.length; i++) {
byte[] bc = new byte[8];
for (int bci = 0; bci < bc.length/2; bci++) {
byte[] ba = Binary.toBitArray(bytes[n]);
bc[2*bci] = ba[firstLSBit];
bc[2*bci+1] = ba[secondLSBit];
n++;
}
bt[i] = Binary.toByte(bc);
}
return new String(bt);
}
á¡áááºážáá¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯ GIFEncryptorByPaletteExtensionMethod
á¡áá¬ážáá°ááŒá
áºáááºá á¡áá»ááºá¡áááºááááºážáááºážááŒááºáž/áááºááŸá¯ááŒááºážáááºážáááºážáá¬áá»áŸáẠááœá²ááŒá¬ážáá«áááºá
á¡áááºážáá²ááŸá¬ MainFrame
wrapper áááºážáááºážáá»á¬ážááᯠáá±á¬áºááŒáá¬ážáá«áááºá encryptImage(Encryptor encryptor)
О decryptImage(Encryptor encryptor)
ááŒá¬ážáá¶áááºážáááºážáá»á¬ážá ááááºáá»á¬ážááᯠáá¯ááºáá±á¬ááºááŒááºážá Encryptor
á¡áá¯á¶ážááŒá¯áá°ááŸáá·áº á¡ááŒááºá¡ááŸáẠáááºáá¶ááŒááºážá ááá¯ááá¯áááºááŸá¬ ááá¯ááºááœá±ážáá»ááºááŸá¯ ááá¯ááºáá¬áá±á¬á·ááºááᯠááœáá·áºááŒááºážá á¡ááŸá¬ážá¡ááœááºáž áááºáá±á·áá»áºáá»á¬áž ááŒáááŒááºáž á
áááºááŒáá·áºá á¡ááŒá¬ážáááºážáááºážáá»á¬ážá¡ááŒáẠopenImage()
á¡áá¯á¶ážááŒá¯áá°ááᯠáá¯á¶áá
áºáá¯á¶ááœá±ážáá»ááºááœáá·áºáá±ážááŒááºážá exit()
á¡ááá®áá±ážááŸááºážá០ááœááºáá±á¬á á€áááºážáá»á¬ážááᯠááŸáá·áºáá±á«áºáááºá Action
áááºááá¯ááºáá±á¬ áá®áá°áž áá
á¹á
ááºážáá»á¬ážá á€á¡áááºážááẠá¡áááºáááºážáááºážáá»á¬ážááᯠáááºáá±á¬ááºážáá¯ááºáá±á¬ááºáááº- createComponents()
- áá¯á¶á
ᶠá¡á
áááºá¡ááá¯ááºážáá»á¬áž áááºáá®ážááŒááºážá loadImageFile(File f)
â ááá¯ááºáá
áºáá¯á០á¡áá°ážá¡á
áááºá¡ááá¯ááºážáá
áºáá¯ááá¯á· áá¯á¶áá
áºáá¯ááᯠáááºááŒááºážá á¡áááºážáá¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯ GIFEncryptorByPaletteExtensionMethod
class implementation áá²á· áááºáá°áá«áááºá GIFEncryptorByLSBMethod
á¡áááááœá¬ááŒá¬ážáá»ááºááŸá¬ palette á០message bytes áá»á¬ážááᯠáá±ážáá¬ážááŒááºážááŸáá·áº áááºááŒááºážááœááºááŒá
áºáááºá
áááá¯ááááºáááºáááºááŸá¯
LBS áááºážáááºáž
áá®ááá¯áá¯á¶áá±ážááŸááááºááá¯áá«á áá¯á·á
á€áá¯á¶ááœááºá palette ááœáẠá¡áá±á¬áẠ256 áá±á¬áẠ(Paint save as) áá«áááºáá«áááºá áááá¡áá±á¬ááºáá±ážáá»áá¯ážááá±á¬á· á¡ááŒá°á á¡áááºá á¡áá®á á¡á
áááºážá á¡ááŒá¬ážá¡áá±á¬ááºáá»á¬ážááŸá¬ á¡áááºáá±á¬ááºááŒá
áºáááºá global palette bit sequence ááẠá¡á±á¬ááºáá«á¡ááá¯ááºáž ááŒá
áºáááá·áºááẠá
11111111 11111111 11111111 00000000 00000000 00000000 11111111 00000000 00000000 00000000 11111111 00000000...
áááºáá±á·áá»áºááᯠááá·áºááœááºážááŒá®ážáááºááŸáá·áºá áá»ááºážáá¬ážáá¬ážáá±á¬ áá
áºáá»á¬ážááᯠáááºáá±á·áá»áºá០áá
áºáá»á¬ážááŒáá·áº á¡á
á¬ážááá¯ážáááºááŒá
áºáááºá ááá¬áá²á·áá¯á¶á áá°áááºážáá¯á¶áá²á· áá¯á¶ážáááá°áá«áá°ážá
áá°áááºáž
ááá·áºááœááºážáá¬ážáá±á¬ áááºáá±á·áá»áºááŸáá·áºá¡áá° áá¯á¶
Palette áá»á²á·áááºáž
á€áááºážáááºážááᯠá¡áá¯á¶ážááŒá¯á áááºáá±á·áá»áºáá«ááŸááá±á¬ áá¯á¶áá áºáá¯á¶ááᯠáááºááœáá·áºáá±á¬á¡áá«ááœáẠá¡á±á¬ááºáá«áá¯á¶ááᯠáááºááœá±á·ááŒááºááááá·áºáááº-
á€áááºážáááºážááẠááŒá®ážááŒáá·áºá
á¯á¶áá±á¬ áá°áá»áŸáá¯ááŸá¯ááºááŸá¬ážááŸá¯áá»á¬ážá¡ááœáẠá¡áá¯ááºáááŒá
áºááá¯ááºááŒá±á¬ááºážááŸáá·áº áááºáá±á·áá»áºá áááºáá±á¬ááºážáá¯ááºááŸááºááŒááºáž ááá¯á¡ááºááá¯ááºááẠáááºááŸá¬ážáá«áááºá
áá¬ááœááºážáá¯ááºáá¯á¶áá»á¬ážááœáẠáá¯ááºááŸááºááŒááºáž/á á¬ááŸááºááŒááºáž ááẠáá¯á¶ááŸáẠáá¯á¶ááá¹áá¬ááºáá¯á¶áá»á¬ážáá²á·ááá¯á· á¡áá¯ááºáá¯ááºáá±á¬áºáááºáž áá¬ááœááºážáá¯ááºáá¯á¶áá»á¬ážááẠáá»ááºáááœá¬ážáá«á
á¡áá¯á¶ážááŒá¯áá¬ážáá±á¬ á¡áááºážá¡ááŒá áºáá»á¬áž-
http://ru.wikipedia.org/wiki/Gif http://ru.wikipedia.org/wiki/СÑегаМПгÑаÑÐžÑ http://home.onego.ru/~chiezo/gif.htm
áá±á«ááºážáá¯ááº:
source: www.habr.com