JAVA 由图片合成gif文件
1、需要四个类,直接应用到项目中,不需要做太多改动,除了导包:
2、jpgToGif函数需要传入两个参数,第一个参数为要合成的图片路径数组,第二个参数为合成的GIF图片将存在的路径。
例如: 第一个参数为 String pic[] = {"d:/1.jpg","d:/2.jpg"};
第二个参数为 String newPic = "d:/test.gif";
最终合成的gif文件为test.gif,由1.jpg和2.jpg合成
public class JpgToGif {
public void jpgToGif(String pic[], StringnewPic) {
try {
AnimatedGifEncoder1 e= new AnimatedGifEncoder1();
e.setRepeat(1);
e.start(newPic);
for (int i = 0; i <pic.length; i++) {
// 设置播放的延迟时间
e.setDelay(300);
Bitmap src = BitmapFactory.decodeFile(pic[i]);
e.addFrame(src); // 添加到帧中
}
e.finish();// 刷新任何未决的数据,并关闭输出文件
} catch (Exception e) {
e.printStackTrace();
}
}
}
第二个类:
public class LZWEncoder {
private static final int EOF = -1;
private int imgW, imgH;
private byte[] pixAry;
private int initCodeSize;
private int remaining;
private int curPixel;
// GIFCOMPR.C - GIF Image compression routines
//
// Lempel-Ziv compression based on 'compress'. GIF modificationsby
// David Rowley (mgardi@watdcsu.waterloo.edu)
// General DEFINEs
static final int BITS = 12;
static final int HSIZE = 5003; // 80% occupancy
// GIF Image compression - modified 'compress'
//
// Based on: compress.c - File compression ala IEEEComputer, June 1984.
//
// By Authors: Spencer W. Thomas(decvax!harpo!utah-cs!utah-gr!thomas)
// Jim McKie (decvax!mcvax!jim)
// Steve Davies (decvax!vax135!petsd!peora!srd)
// Ken Turkowski (decvax!decwrl!turtlevax!ken)
// James A. Woods (decvax!ihnp4!ames!jaw)
// Joe Orost (decvax!vax135!petsd!joe)
int n_bits; // number of bits/code
int maxbits = BITS; // user settable max # bits/code
int maxcode; // maximum code, given n_bits
int maxmaxcode = 1 << BITS; // should NEVER generatethis code
int[] htab = new int[HSIZE];
int[] codetab = new int[HSIZE];
int hsize = HSIZE; // for dynamic table sizing
int free_ent = 0; // first unused entry
// block compression parameters -- after all codes are usedup,
// and compression rate changes, start over.
boolean clear_flg = false;
// Algorithm: use open addressing double hashing (nochaining) on the
// prefix code / next character combination. We do a variantof Knuth's
// algorithm D (vol. 3, sec. 6.4) along with G. Knott'srelatively-prime
// secondary probe. Here, the modular division first probeis gives way
// to a faster exclusive-or manipulation. Also do blockcompression with
// an adaptive reset, whereby the code table is cleared whenthe compression
// ratio decreases, but after the table fills. Thevariable-length output
// codes are re-sized at this point, and a special CLEARcode is generated
// for the decompressor. Late addition: construct the tableaccording to
// file size for noticeable speed improvement on smallfiles. Please direct
// questions about this implementation to ames!jaw.
int g_init_bits;
int ClearCode;
int EOFCode;
// output
//
// Output the given code.
// Inputs:
// code: A n_bits-bit integer. If == -1, then EOF. Thisassumes
// that n_bits =< wordsize - 1.
// Outputs:
// Outputs code to the file.
// Assumptions:
// Chars are 8 bits long.
// Algorithm:
// Maintain a BITS character long buffer (so that 8 codeswill
// fit in it exactly). Use the VAX insv instruction toinsert each
// code in turn. When the buffer fills up empty it and startover.
int cur_accum = 0;
int cur_bits = 0;
int masks[] = { 0x0000, 0x0001, 0x0003, 0x0007, 0x000F,0x001F, 0x003F,
0x007F, 0x00FF,0x01FF, 0x03FF, 0x07FF, 0x0FFF, 0x1FFF, 0x3FFF,
0x7FFF, 0xFFFF };
// Number of characters so far in this 'packet'
int a_count;
// Define the storage for the packet accumulator
byte[] accum = new byte[256];
//----------------------------------------------------------------------------
LZWEncoder(int width, int height, byte[] pixels, int color_depth){
imgW = width;
imgH = height;
pixAry = pixels;
initCodeSize = Math.max(2, color_depth);
}
// Add a character to the end of the current packet, and ifit is 254
// characters, flush the packet to disk.
void char_out(byte c, OutputStream outs) throws IOException{
accum[a_count++] = c;
if (a_count >= 254)
flush_char(outs);
}
// Clear out the hash table
// table clear for block compress
void cl_block(OutputStream outs) throws IOException {
cl_hash(hsize);
free_ent = ClearCode + 2;
clear_flg = true;
output(ClearCode, outs);
}
// reset code table
void cl_hash(int hsize) {
for (int i = 0; i < hsize; ++i)
htab[i] = -1;
}
void compress(int init_bits, OutputStream outs) throwsIOException {
int fcode;
int i /* = 0 */;
int c;
int ent;
int disp;
int hsize_reg;
int hshift;
// Set up the globals: g_init_bits -initial number of bits
g_init_bits = init_bits;
// Set up the necessary values
clear_flg = false;
n_bits = g_init_bits;
maxcode = MAXCODE(n_bits);
ClearCode = 1 << (init_bits - 1);
EOFCode = ClearCode + 1;
free_ent = ClearCode + 2;
a_count = 0; // clear packet
ent = nextPixel();
hshift = 0;
for (fcode = hsize; fcode < 65536;fcode *= 2)
++hshift;
hshift = 8 - hshift; // set hash coderange bound
hsize_reg = hsize;
cl_hash(hsize_reg); // clear hash table
output(ClearCode, outs);
outer_loop: while ((c = nextPixel()) !=EOF) {
fcode = (c <<maxbits) + ent;
i = (c <<hshift) ^ ent; // xor hashing
if (htab[i] == fcode){
ent= codetab[i];
continue;
} else if (htab[i]>= 0) // non-empty slot
{
disp = hsize_reg - i; // secondary hash (after G. Knott)
if(i == 0)
disp = 1;
do{
if ((i -= disp) < 0)
i += hsize_reg;
if (htab[i] == fcode) {
ent = codetab[i];
continue outer_loop;
}
}while (htab[i] >= 0);
}
output(ent, outs);
ent = c;
if (free_ent <maxmaxcode) {
codetab[i] = free_ent++; // code -> hashtable
htab[i] = fcode;
} else
cl_block(outs);
}
// Put out the final code.
output(ent, outs);
output(EOFCode, outs);
}
// ----------------------------------------------------------------------------
void encode(OutputStream os) throws IOException {
os.write(initCodeSize); // write"initial code size" byte
remaining = imgW * imgH; // resetnavigation variables
curPixel = 0;
compress(initCodeSize + 1, os); //compress and write the pixel data
os.write(0); // write block terminator
}
// Flush the packet to disk, and reset the accumulator
void flush_char(OutputStream outs) throws IOException {
if (a_count > 0) {
outs.write(a_count);
outs.write(accum, 0,a_count);
a_count = 0;
}
}
final int MAXCODE(int n_bits) {
return (1 << n_bits) - 1;
}
// ----------------------------------------------------------------------------
// Return the next pixel from the image
//----------------------------------------------------------------------------
private int nextPixel() {
if (remaining == 0)
return EOF;
--remaining;
byte pix = pixAry[curPixel++];
return pix & 0xff;
}
void output(int code, OutputStream outs) throws IOException{
cur_accum &= masks[cur_bits];
if (cur_bits > 0)
cur_accum |= (code<< cur_bits);
else
cur_accum = code;
cur_bits += n_bits;
while (cur_bits >= 8) {
char_out((byte)(cur_accum & 0xff), outs);
cur_accum >>= 8;
cur_bits -= 8;
}
// If the next entry is going to be toobig for the code size,
// then increase it, if possible.
if (free_ent > maxcode || clear_flg) {
if (clear_flg) {
maxcode = MAXCODE(n_bits = g_init_bits);
clear_flg= false;
} else {
++n_bits;
if(n_bits == maxbits)
maxcode = maxmaxcode;
else
maxcode = MAXCODE(n_bits);
}
}
if (code == EOFCode) {
// At EOF, write therest of the buffer.
while (cur_bits >0) {
char_out((byte) (cur_accum & 0xff), outs);
cur_accum >>= 8;
cur_bits -= 8;
}
flush_char(outs);
}
}
}
第三个类:
public class AnimatedGifEncoder1 {
protected boolean closeStream;
protected int colorDepth;
protected byte[] colorTab;
protected int delay = 0;
protected int dispose;
protected boolean firstFrame;
protected int height;
protected Bitmap image;
protected byte[] indexedPixels;
protected OutputStream out;
protected int palSize;
protected byte[] pixels;
protected int repeat = -1;
protected int sample;
protected boolean sizeSet;
protected boolean started;
protected int transIndex;
protected int transparent = 0;
protected boolean[] usedEntry;
protected int width;
public AnimatedGifEncoder1() {
boolean[] arrayOfBoolean = newboolean[256];
this.usedEntry = arrayOfBoolean;
this.palSize = 7;
this.dispose = -1;
this.closeStream = false;
this.firstFrame = true;
this.sizeSet = false;
this.sample = 10;
}
public boolean addFrame(Bitmap paramBitmap) {
boolean ok = true;
if (paramBitmap == null || !started) {
return false;
}
try {
Log.i("AnimatedGifEncode...", "AnimatedGifEncode is addFrame="
+ paramBitmap);
if (!sizeSet) {
inti = paramBitmap.getWidth();
intl = paramBitmap.getHeight();
setSize(i, l);
}
this.image =paramBitmap;
getImagePixels();
analyzePixels();
if (firstFrame) {
writeLSD();
writePalette();
if(repeat >= 0)
writeNetscapeExt();
}
writeGraphicCtrlExt();
writeImageDesc();
if (!firstFrame)
writePalette();
writePixels();
this.firstFrame =false;
} catch (IOException localIOException1) {
ok = false;
}
return ok;
}
protected void analyzePixels() {
int len = this.pixels.length;
int nPix = len / 3;
byte[] arrayOfByte1 = new byte[nPix];
this.indexedPixels = arrayOfByte1;
byte[] arrayOfByte2 = this.pixels;
int k = this.sample;
NeuQuant nq = new NeuQuant(arrayOfByte2,len, k);
this.colorTab = nq.process();
int l = 0;
int i1 = this.colorTab.length;
Object localObject;
if (l >= i1) {
l = 0;
localObject = null;
}
for (int i = 0; i < colorTab.length; i+= 3) {
byte temp =colorTab[i];
colorTab[i] =colorTab[i + 2];
colorTab[i + 2] =temp;
usedEntry[i / 3] =false;
}
int k1 = 0;
for (int i = 0; i < nPix; i++) {
int index =nq.map(pixels[k1++] & 0xff, pixels[k1++] & 0xff,
pixels[k1++] & 0xff);
usedEntry[index] =true;
indexedPixels[i] =(byte) index;
}
pixels = null;
colorDepth = 8;
palSize = 7;
if (transparent != 0) {
transIndex =findClosest(transparent);
}
}
protected int findClosest(int paramInt) {
if (colorTab == null) {
return -1;
}
int r = Color.red(paramInt);
int g = Color.green(paramInt);
int b = Color.blue(paramInt);
int minpos = 0;
int dmin = 256 * 256 * 256;
int len = colorTab.length;
for (int i = 0; i < len;) {
int dr = r -(colorTab[i++] & 0xff);
int dg = g -(colorTab[i++] & 0xff);
int db = b -(colorTab[i] & 0xff);
int d = dr * dr + dg *dg + db * db;
int index = i / 3;
if (usedEntry[index]&& (d < dmin)) {
dmin = d;
minpos = index;
}
i++;
}
return minpos;
}
public boolean finish() {
if (!started)
return false;
boolean ok = true;
started = false;
try {
out.write(0x3b); //gif trailer
out.flush();
if (closeStream) {
out.close();
}
} catch (IOException e) {
ok = false;
}
// reset for subsequent use
transIndex = 0;
out = null;
image = null;
pixels = null;
indexedPixels = null;
colorTab = null;
closeStream = false;
firstFrame = true;
return ok;
}
protected void getImagePixels() {
int w = this.image.getWidth();
int h = this.image.getHeight();
Bitmap.Config localConfig =Bitmap.Config.ARGB_8888;
Bitmap localBitmap1 =Bitmap.createBitmap(w, h, localConfig);
Canvas localCanvas = newCanvas(localBitmap1);
localCanvas.save();
Paint localPaint = new Paint();
localCanvas.drawBitmap(image, 0, 0,localPaint);
localCanvas.restore();
this.pixels = new byte[w * h * 3];
int[] arrayOfInt = new int[w * h];
int k = 0;
int l = 0;
int i1 = w;
localBitmap1.getPixels(arrayOfInt, 0, w,k, l, i1, h);
int localObject = 0;
while (true) {
if (localObject >=arrayOfInt.length)
return;
pixels[localObject *3] = (byte) Color
.blue(arrayOfInt[localObject]);
pixels[localObject * 3+ 1] = (byte) Color
.green(arrayOfInt[localObject]);
pixels[localObject * 3+ 2] = (byte) Color
.red(arrayOfInt[localObject]);
++localObject;
}
}
public void setDelay(int ms) {
delay = Math.round(ms / 10.0f);
}
public void setDispose(int code) {
if (code >= 0) {
dispose = code;
}
}
public void setFrameRate(float fps) {
if (fps != 0f) {
delay =Math.round(100f / fps);
}
}
public void setQuality(int quality) {
if (quality < 1)
quality = 1;
sample = quality;
}
public void setRepeat(int iter) {
if (iter >= 0) {
Log.i("AnimatedGifEncode...",
"AnimatedGifEncode is setRepeat..setRepeat =");
repeat = iter;
}
}
public void setSize(int w, int h) {
if (started && !firstFrame)
return;
width = w;
height = h;
if (width < 1)
width = 320;
if (height < 1)
height = 240;
sizeSet = true;
}
public void setTransparent(int c) {
this.transparent = c;
}
public boolean start(OutputStream os) {
if (os == null)
return false;
boolean ok = true;
closeStream = false;
out = os;
Log.i("AnimatedGifEncode...","AnimatedGifEncode is start outputSteam");
try {
writeString("GIF89a"); // header
} catch (IOException e) {
ok = false;
}
return started = ok;
}
public boolean start(String file) {
boolean ok = true;
try {
out = newBufferedOutputStream(new FileOutputStream(file));
ok = start(out);
Log.i("AnimatedGifEncode...", "AnimatedGifEncode is start=" + file);
closeStream = true;
} catch (IOException e) {
ok = false;
}
return started = ok;
}
protected void writeGraphicCtrlExt() throws IOException {
out.write(0x21); // extension introducer
out.write(0xf9); // GCE label
out.write(4); // data block size
int transp, disp;
if (transparent == 0) {
transp = 0;
disp = 0; // dispose =no action
} else {
transp = 1;
disp = 2; // forceclear if using transparent color
}
if (dispose >= 0) {
disp = dispose &7; // user override
}
disp <<= 2;
// packed fields
out.write(0 | // 1:3 reserved
disp | // 4:6 disposal
0 |// 7 user input - 0 = none
transp); // 8 transparency flag
writeShort(delay); // delay x 1/100 sec
out.write(transIndex); // transparentcolor index
out.write(0); // block terminator
}
protected void writeImageDesc() throws IOException {
out.write(0x2c); // image separator
writeShort(0); // image position x,y =0,0
writeShort(0);
writeShort(width); // image size
writeShort(height);
// packed fields
if (firstFrame) {
// no LCT - GCT isused for first (or only) frame
out.write(0);
} else {
// specify normal LCT
out.write(0x80 | // 1local color table 1=yes
0 | // 2 interlace - 0=no
0 | // 3 sorted - 0=no
0 | // 4-5 reserved
palSize); // 6-8 size of color table
}
}
protected void writeLSD() throws IOException {
// logical screen size
writeShort(width);
writeShort(height);
// packed fields
out.write((0x80 | // 1 : global colortable flag = 1 (gct used)
0x70 | // 2-4 : color resolution = 7
0x00 | // 5 : gct sort flag = 0
palSize)); // 6-8 : gct size
out.write(0); // background color index
out.write(0); // pixel aspect ratio -assume 1:1
}
protected void writeNetscapeExt() throws IOException {
out.write(0x21); // extension introducer
out.write(0xff); // app extension label
out.write(11); // block size
writeString("NETSCAPE" +"2.0"); // app id + auth code
out.write(3); // sub-block size
out.write(1); // loop sub-block id
writeShort(repeat); // loop count (extraiterations, 0=repeat forever)
out.write(0); // block terminator
}
protected void writePalette() throws IOException {
out.write(colorTab, 0, colorTab.length);
int n = (3 * 256) - colorTab.length;
for (int i = 0; i < n; i++) {
out.write(0);
}
}
protected void writePixels() throws IOException {
LZWEncoder encoder = newLZWEncoder(width, height, indexedPixels,
colorDepth);
encoder.encode(out);
}
protected void writeShort(int value) throws IOException {
out.write(value & 0xff);
out.write((value >> 8) & 0xff);
}
protected void writeString(String s) throws IOException {
for (int i = 0; i < s.length(); i++) {
out.write((byte)s.charAt(i));
Log.i("AnimatedGifEncode...", "AnimatedGifEncode is readheader!!!");
}
}
}
第四个类:
public class NeuQuant {
protected static final int netsize = 256; /* number ofcolours used */
/* four primes near 500 - assume no image has a length solarge */
/* that it is divisible by all four primes */
protected static final int prime1 = 499;
protected static final int prime2 = 491;
protected static final int prime3 = 487;
protected static final int prime4 = 503;
protected static final int minpicturebytes = (3 * prime4);
/* minimum size for input image */
/*
* Program Skeleton ---------------- [select samplefacin range 1..30] [read
* image from input file] pic = (unsigned char*)malloc(3*width*height);
* initnet(pic,3*width*height,samplefac); learn();unbiasnet(); [write
* output image header, using writecolourmap(f)]inxbuild(); write output
* image using inxsearch(b,g,r)
*/
/*
* Network Definitions -------------------
*/
protected static final int maxnetpos = (netsize - 1);
protected static final int netbiasshift = 4; /* bias forcolour values */
protected static final int ncycles = 100; /* no. of learningcycles */
/* defs for freq and bias */
protected static final int intbiasshift = 16; /* bias forfractions */
protected static final int intbias = (((int) 1) <<intbiasshift);
protected static final int gammashift = 10; /* gamma = 1024*/
protected static final int gamma = (((int) 1) <<gammashift);
protected static final int betashift = 10;
protected static final int beta = (intbias >>betashift); /* beta = 1/1024 */
protected static final int betagamma = (intbias <<(gammashift - betashift));
/* defs for decreasing radius factor */
protected static final int initrad = (netsize >> 3);/*
* for 256 cols, radius
* starts
*/
protected static final int radiusbiasshift = 6; /* at 32.0biased by 6 bits */
protected static final int radiusbias = (((int) 1) <<radiusbiasshift);
protected static final int initradius = (initrad *radiusbias); /*
* and
* decreases
* by a
*/
protected static final int radiusdec = 30; /* factor of 1/30each cycle */
/* defs for decreasing alpha factor */
protected static final int alphabiasshift = 10; /* alphastarts at 1.0 */
protected static final int initalpha = (((int) 1) <<alphabiasshift);
protected int alphadec; /* biased by 10 bits */
/* radbias and alpharadbias used for radpower calculation */
protected static final int radbiasshift = 8;
protected static final int radbias = (((int) 1) <<radbiasshift);
protected static final int alpharadbshift = (alphabiasshift+ radbiasshift);
protected static final int alpharadbias = (((int) 1)<< alpharadbshift);
/*
* Types and Global Variables--------------------------
*/
protected byte[] thepicture; /* the input image itself */
protected int lengthcount; /* lengthcount = H*W*3 */
protected int samplefac; /* sampling factor 1..30 */
// typedef int pixel[4]; /* BGRc */
protected int[][] network; /* the network itself -[netsize][4] */
protected int[] netindex = new int[256];
/* for network lookup - really 256 */
protected int[] bias = new int[netsize];
/* bias and freq arrays for learning */
protected int[] freq = new int[netsize];
protected int[] radpower = new int[initrad];
/* radpower for precomputation */
/*
* Initialise network in range (0,0,0) to (255,255,255)and set parameters
*-----------------------------------------------------------------------
*/
public NeuQuant(byte[] thepic, int len, int sample) {
int i;
int[] p;
thepicture = thepic;
lengthcount = len;
samplefac = sample;
network = new int[netsize][];
for (i = 0; i < netsize; i++) {
network[i] = newint[4];
p = network[i];
p[0] = p[1] = p[2] =(i << (netbiasshift + 8)) / netsize;
freq[i] = intbias /netsize; /* 1/netsize */
bias[i] = 0;
}
}
public byte[] colorMap() {
byte[] map = new byte[3 * netsize];
int[] index = new int[netsize];
for (int i = 0; i < netsize; i++)
index[network[i][3]] =i;
int k = 0;
for (int i = 0; i < netsize; i++) {
int j = index[i];
map[k++] = (byte)(network[j][0]);
map[k++] = (byte)(network[j][1]);
map[k++] = (byte)(network[j][2]);
}
return map;
}
/*
* Insertion sort of network and building ofnetindex[0..255] (to do after
* unbias)
*------------------------------------------------------------------
* -------------
*/
public void inxbuild() {
int i, j, smallpos, smallval;
int[] p;
int[] q;
int previouscol, startpos;
previouscol = 0;
startpos = 0;
for (i = 0; i < netsize; i++) {
p = network[i];
smallpos = i;
smallval = p[1]; /*index on g */
/* find smallest ini..netsize-1 */
for (j = i + 1; j <netsize; j++) {
q =network[j];
if(q[1] < smallval) { /* index on g */
smallpos = j;
smallval = q[1]; /* index on g */
}
}
q = network[smallpos];
/* swap p (i) and q(smallpos) entries */
if (i != smallpos) {
j =q[0];
q[0] = p[0];
p[0] = j;
j =q[1];
q[1] = p[1];
p[1] = j;
j =q[2];
q[2] = p[2];
p[2] = j;
j =q[3];
q[3] = p[3];
p[3] = j;
}
/* smallval entry isnow in position i */
if (smallval !=previouscol) {
netindex[previouscol] = (startpos + i) >> 1;
for(j = previouscol + 1; j < smallval; j++)
netindex[j] = i;
previouscol = smallval;
startpos = i;
}
}
netindex[previouscol] = (startpos +maxnetpos) >> 1;
for (j = previouscol + 1; j < 256;j++)
netindex[j] =maxnetpos; /* really 256 */
}
/*
* Main Learning Loop ------------------
*/
public void learn() {
int i, j, b, g, r;
int radius, rad, alpha, step, delta,samplepixels;
byte[] p;
int pix, lim;
if (lengthcount < minpicturebytes)
samplefac = 1;
alphadec = 30 + ((samplefac - 1) / 3);
p = thepicture;
pix = 0;
lim = lengthcount;
samplepixels = lengthcount / (3 *samplefac);
delta = samplepixels / ncycles;
alpha = initalpha;
radius = initradius;
rad = radius >> radiusbiasshift;
if (rad <= 1)
rad = 0;
for (i = 0; i < rad; i++)
radpower[i] = alpha
* (((rad * rad - i * i) * radbias) / (rad * rad));
// fprintf(stderr,"beginning 1Dlearning: initial radius=%d\n", rad);
if (lengthcount < minpicturebytes)
step = 3;
else if ((lengthcount % prime1) != 0)
step = 3 * prime1;
else {
if ((lengthcount %prime2) != 0)
step = 3 * prime2;
else {
if((lengthcount % prime3) != 0)
step = 3 * prime3;
else
step = 3 * prime4;
}
}
i = 0;
while (i < samplepixels) {
b = (p[pix + 0] &0xff) << netbiasshift;
g = (p[pix + 1] &0xff) << netbiasshift;
r = (p[pix + 2] &0xff) << netbiasshift;
j = contest(b, g, r);
altersingle(alpha, j,b, g, r);
if (rad != 0)
alterneigh(rad, j, b, g, r); /* alter neighbours */
pix += step;
if (pix >= lim)
pix-= lengthcount;
i++;
if (delta == 0)
delta = 1;
if (i % delta == 0) {
alpha -= alpha / alphadec;
radius -= radius / radiusdec;
rad= radius >> radiusbiasshift;
if(rad <= 1)
rad = 0;
for(j = 0; j < rad; j++)
radpower[j] = alpha
* (((rad * rad - j *j) * radbias) / (rad * rad));
}
}
// fprintf(stderr,"finished 1Dlearning: final alpha=%f !\n",((float)alpha)/initalpha);
}
/*
* Search for BGR values 0..255 (after net is unbiased)and return colour
* index
*--------------------------------------------------------------------
* --------
*/
public int map(int b, int g, int r) {
int i, j, dist, a, bestd;
int[] p;
int best;
bestd = 1000; /* biggest possible dist is256*3 */
best = -1;
i = netindex[g]; /* index on g */
j = i - 1; /* start at netindex[g] andwork outwards */
while ((i < netsize) || (j >= 0)) {
if (i < netsize) {
p =network[i];
dist = p[1] - g; /* inx key */
if(dist >= bestd)
i = netsize; /* stop iter */
else {
i++;
if (dist < 0)
dist = -dist;
a = p[0] - b;
if (a < 0)
a = -a;
dist += a;
if (dist < bestd) {
a = p[2] - r;
if (a < 0)
a = -a;
dist += a;
if (dist < bestd) {
bestd = dist;
best = p[3];
}
}
}
}
if (j >= 0) {
p =network[j];
dist= g - p[1]; /* inx key - reverse dif */
if(dist >= bestd)
j = -1; /* stop iter */
else {
j--;
if (dist < 0)
dist = -dist;
a = p[0] - b;
if (a < 0)
a = -a;
dist += a;
if (dist < bestd) {
a = p[2] - r;
if (a < 0)
a = -a;
dist += a;
if (dist < bestd) {
bestd = dist;
best = p[3];
}
}
}
}
}
return (best);
}
public byte[] process() {
learn();
unbiasnet();
inxbuild();
return colorMap();
}
/*
* Unbias network to give byte values 0..255 and recordposition i to
* prepare for sort
*----------------------------------------------------------
* -------------------------
*/
public void unbiasnet() {
int i, j;
for (i = 0; i < netsize; i++) {
network[i][0]>>= netbiasshift;
network[i][1]>>= netbiasshift;
network[i][2]>>= netbiasshift;
network[i][3] = i; /*record colour no */
}
}
/*
* Move adjacent neurons by precomputedalpha*(1-((i-j)^2/[r]^2)) in
* radpower[|i-j|]
*----------------------------------------------------------
* -----------------------
*/
protected void alterneigh(int rad, int i, int b, int g, intr) {
int j, k, lo, hi, a, m;
int[] p;
lo = i - rad;
if (lo < -1)
lo = -1;
hi = i + rad;
if (hi > netsize)
hi = netsize;
j = i + 1;
k = i - 1;
m = 1;
while ((j < hi) || (k > lo)) {
a = radpower[m++];
if (j < hi) {
p =network[j++];
try{
p[0] -= (a * (p[0] - b)) / alpharadbias;
p[1] -= (a * (p[1] - g)) / alpharadbias;
p[2] -= (a * (p[2] - r)) / alpharadbias;
} catch(Exception e) {
}// prevents 1.3 miscompilation
}
if (k > lo) {
p =network[k--];
try{
p[0] -= (a * (p[0] - b)) / alpharadbias;
p[1] -= (a * (p[1] - g)) / alpharadbias;
p[2] -= (a * (p[2] - r)) / alpharadbias;
}catch (Exception e) {
}
}
}
}
/*
* Move neuron i towards biased (b,g,r) by factor alpha
* ----------------------------------------------------
*/
protected void altersingle(int alpha, int i, int b, int g,int r) {
/* alter hit neuron */
int[] n = network[i];
n[0] -= (alpha * (n[0] - b)) / initalpha;
n[1] -= (alpha * (n[1] - g)) / initalpha;
n[2] -= (alpha * (n[2] - r)) / initalpha;
}
/*
* Search for biased BGR values----------------------------
*/
protected int contest(int b, int g, int r) {
/* finds closest neuron (min dist) andupdates freq */
/* finds best neuron (min dist-bias) andreturns position */
/*
* for frequently chosen neurons,freq[i] is high and bias[i] is
* negative
*/
/* bias[i] = gamma*((1/netsize)-freq[i])*/
int i, dist, a, biasdist, betafreq;
int bestpos, bestbiaspos, bestd,bestbiasd;
int[] n;
bestd = ~(((int) 1) << 31);
bestbiasd = bestd;
bestpos = -1;
bestbiaspos = bestpos;
for (i = 0; i < netsize; i++) {
n = network[i];
dist = n[0] - b;
if (dist < 0)
dist = -dist;
a = n[1] - g;
if (a < 0)
a =-a;
dist += a;
a = n[2] - r;
if (a < 0)
a =-a;
dist += a;
if (dist < bestd) {
bestd = dist;
bestpos = i;
}
biasdist = dist -((bias[i]) >> (intbiasshift - netbiasshift));
if (biasdist <bestbiasd) {
bestbiasd = biasdist;
bestbiaspos = i;
}
betafreq = (freq[i]>> betashift);
freq[i] -= betafreq;
bias[i] += (betafreq<< gammashift);
}
freq[bestpos] += beta;
bias[bestpos] -= betagamma;
return (bestbiaspos);
}
}
JAVA 由图片合成gif文件相关推荐
- JAVA操作图片/合成/电子盖章等
JAVA操作图片/合成/电子盖章等 /**** @param mainFile* @param file1* @param f 透明度 最大为1* @param response* @return* ...
- java 处理图片图片合成
最近写了一个java的图片合成相关的项目,真的是一踩一个坑,下面博主说说遇见的一些坑和怎么解决的这些问题. 本文主要讲图片合成,加文字还是比较简单的. 先讲下我的需求,把一张图片盖到另外一张图片上面, ...
- c语言.jpg图片转成数组_多张jpg图片合成pdf文件
唐县职称公众号 微信视频号 评审条件(小程序) 关于如何将多张jpg图片合成pdf文件 首先再强调一下"扫描",不要用手机拍照.高拍仪代替扫描.否则责任自负. 如何将多张JPG图片 ...
- Java 实现图片合成
2019独角兽企业重金招聘Python工程师标准>>> 图片合成 利用Java的绘图方法,实现图片合成 在开始之前,先定一个小目标,我们希望通过图片合成的方式,创建一个类似下面样式的 ...
- java进行图片合成以及写入自定义字体
由于工作需要做了一个利用java的Graphics2D进行图片合成且在图片上写入自定义字体文字的小功能, 那就顺便记录一些痕迹,有什么不好的地方请见谅 public static void main( ...
- Java实现图片转换PDF文件
文章目录 引入依赖 前端页面 控制层接口 PDF工具类 页面效果 最近因为一些事情,需要将一张简单的图片转换为PDF的文件格式,在网上找了一些工具,但是这些工具不是需要注册账号,就是需要下载软件. 而 ...
- java实现图片转pdf文件
2021年新年快乐!在此祝大家代码无bug~~~ 由于我是驻场开发,前段时间问我要个证件扫描件的PDF文件,我一想,现在转换pdf文件是要花钱的啊,这是我能忍受的了的吗!!! 答案当然是不能啊,我的贫 ...
- java合成tif图片_C# 将图片合成tif文件
[实例简介] [实例截图] [核心代码] using BitMiracle.LibTiff.Classic; using System.Drawing; using System.Drawing.Im ...
- linux centos java kumo图片合成文字 词云插件 字体乱码问题
linux下安装微软雅黑字体库 或者其他字体 jieba 词云 kumo相关 百度随便找个ttf安装就行 用winscp直接切目录 /usr/share/fonts/ 放入*.ttf字体文件 先看看f ...
最新文章
- restful url 设计规范_restFul接口设计规范
- 浅谈网络游戏《天龙X部》的文件加密格式
- jsp 下拉列表选取触发function_Bootstrap下拉菜单样式
- 华为手机怎么看图片属性_华为手机怎么才能息屏显示时间?操作方法很简单,看完涨知识了...
- keepalived+LVS实现高可用的Web负载均衡
- FreeImage 结合 VB6 使用技巧
- 互联网金融爬虫怎么写-第二课 雪球网股票爬虫(正则表达式入门)
- 自动驾驶 从入门到精通 学习资料汇总 Week1~Week7
- Mysql 数据库 主从数据库 (主从)(主主)
- 百度贴吧里如何留网址
- windows脚本切换网络环境
- 强化学习算法TRPO之共轭梯度优化
- U盘快捷方式文件病毒解决方法
- root android 5.0,安卓android5.0怎么一键root? 安卓5.0一键root教程
- 剑指offer之数组中重复的数(Java实现)
- html页面涂鸦,HTML5 | Canvas画笔小应用(涂鸦板)
- DELL 电脑 ubuntu20.04系统安装(最新最简版)
- 第03章 Python的数据结构、函数和文件--Python for Data Analysis 2nd
- 3、Nginx系列之: location和alias的区别
- 思考方法,程序员生存之道