improved steganography functions

This commit is contained in:
rlx 2011-09-08 12:27:40 +00:00
parent 3f3edac8c7
commit 1b4591dcbe
3 changed files with 47 additions and 14 deletions

View file

@ -13,7 +13,7 @@ Ox.load('Image', function() {
'encode("some secret stuff")', 'decode()',
'encode("some secret stuff", true)', 'decode(true)',
'encode("some secret stuff", 1)', 'decode(1)',
'encode("some secret stuff", 127)', 'decode(127)',
'encode("some secret stuff.", 15)', 'decode(15)',
'hue(-60)', 'hue(60)',
'invert()',
'lightness(-0.5)', 'lightness(0.5)',

View file

@ -27,7 +27,7 @@ Ox.load.Image = function(options, callback) {
function getCapacity(bpb) {
var capacity = 0;
that.forEach(function(rgba) {
capacity += rgba[3] == 255 ? bpb / 8 : 0;
capacity += rgba[3] == 255 ? bpb * 3/8 : 0;
});
return capacity;
}
@ -167,21 +167,29 @@ Ox.load.Image = function(options, callback) {
var i = index + c;
Ox.forEach(bits, function(bit) {
if (mode < 1) {
bin += Ox.sum(Ox.range(8).map(function(b) {
return self.data[i] & 1 << b;
bin += Ox.sum(Ox.range(8).map(function(bit) {
return +!!(self.data[i] & 1 << bit);
})) % 2;
} else {
bin += +!!(self.data[i] & i << bit);
bin += +!!(self.data[i] & 1 << bit);
}
/*mode > 0 &&*/ Ox.print(bin)
// /*mode > 0 &&*/ Ox.print(bin)
if (bin.length == 8) {
str += Ox.char(parseInt(bin, 2));
bin = '';
if (str.length == len) {
if (++done == 1) {
len = Ox.decodeBase256(str);
Ox.print("LEN", len)
if (len + 4 > getCapacity(1)) {
Ox.print(Ox.map(str, function(chr) {
return Ox.pad(chr.charCodeAt(0).toString(2), 8);
}).join(' '))
Ox.print("LEN", len, getCapacity(bits.length), bits, xy, c)
Ox.print(Ox.range(index).map(function(i) {
return that.pixel(i, 0).map(function(px, j) {
return j < 4 ? Ox.pad(px.toString(2), 8) : null;
}).join(',')
}).join('\n'))
if (len + 4 > getCapacity(bits.length)) {
error('decode');
}
str = '';
@ -250,16 +258,16 @@ Ox.load.Image = function(options, callback) {
mode < 1
// If the number of bits set to 1, mod 2
? Ox.sum(Ox.range(8).map(function(bit) {
return self.data[i] & 1 << bit;
return +!!(self.data[i] & 1 << bit);
})) % 2
// or the one bit in question
: self.data[i] & 1 << bit
: +!!(self.data[i] & 1 << bit)
// is not equal to the data bit
) != bin[b++]) {
// then flip the bit
self.data[i] ^= 1 << bit;
}
})
});
/*
if (mode < 1) {
if (Ox.sum(Ox.range(8).map(function(bit) {
@ -406,7 +414,7 @@ Ox.load.Image = function(options, callback) {
};
that.pixel = function(x, y, val) {
var index = getIndex(x, y);
var i = getIndex(x, y);
if (!val) {
return Ox.range(4).map(function(c) {
return self.data[i + c];

View file

@ -110,6 +110,7 @@ Ox.Filter = function(options, self) {
float: 'left',
});
Ox.print('s.o.sK', self.options.sortKeys)
self.$limit = Ox.InputGroup({
inputs: [
Ox.Checkbox({
@ -138,6 +139,11 @@ Ox.Filter = function(options, self) {
width: 120
}),
Ox.Select({
/*
items: self.options.sortKeys.map(function(sortKey) {
return {id: sortKey.id, title: sortKey.title[0]}; // fixme: title should not have become an array
}),
*/
items: self.options.sortKeys,
width: 128
}),
@ -182,6 +188,25 @@ Ox.Filter = function(options, self) {
]
});
/*
// fixme: sortKeys have been altered, probably by some select
Ox.print('s.o.sK', self.options.sortKeys)
self.$sort = Ox.InputGroup({
inputs: [
Ox.Checkbox({
width: 16
}),
Ox.Select({
items: self.options.sortKeys,
width: 128
})
],
separators: [
{title: 'By default, sort by', width: 112}
]
});
*/
self.$save = Ox.InputGroup({
inputs: [
Ox.Checkbox({
@ -197,7 +222,7 @@ Ox.Filter = function(options, self) {
]
});
self.$items = [self.$operator, self.$limit, self.$view, self.$save];
self.$items = [self.$operator, self.$limit, self.$view/*, self.$sort*/, self.$save];
self.$form = Ox.Form({
items: self.$items
@ -237,7 +262,7 @@ Ox.Filter = function(options, self) {
oldType = Ox.getObjectById(self.options.findKeys, condition.key).type,
newType = Ox.getObjectById(self.options.findKeys, key).type,
oldConditionType = getConditionType(oldType),
newConditionType = getConditionType(newType);
newConditionType = getConditionType(newType),
changeConditionType = oldConditionType != newConditionType;
Ox.print('old new', oldConditionType, newConditionType)
condition.key = key;