/** * Creates a new JpegInfo object. * * @param image DOCUMENT ME! */ public JpegInfo(Image image) { Components = new Object[NumberOfComponents]; compWidth = new int[NumberOfComponents]; compHeight = new int[NumberOfComponents]; BlockWidth = new int[NumberOfComponents]; BlockHeight = new int[NumberOfComponents]; imageobj = image; imageWidth = image.getWidth(null); imageHeight = image.getHeight(null); Comment = "JPEG Encoder Copyright 1998, James R. Weeks and BioElectroMech. "; getYCCArray(); }
static void GoEnd(JFrame frame, int i) { Image background = new ImageIcon("image/final_" + i + ".png").getImage(); background = background.getScaledInstance(frame.getWidth(), frame.getHeight(), Image.SCALE_DEFAULT); JLabel back = new JLabel(); back.setBounds(0, 0, frame.getWidth(), frame.getHeight()); back.setIcon(new ImageIcon(background)); frame.add(back, 1); frame.validate(); frame.repaint(); if (i == 1) { // 烤好 Talk.say("你成功的通過了這學期", 1); Talk.say("這次經驗也讓你對學習產生濃烈的興趣", 1); Talk.say("讓你大四成為了神,進而順利畢業", 1); } else if (i == 2) { // 系館 Talk.say("經由你的捐贈", 1); Talk.say("資訊系逐漸自成一個校區", 1); Talk.say("而在原系館中庭擺放了一個十倍放大的銅像", 1); Talk.say("用來紀念資訊系傑出校友─大恩碩像", 1); } else if (i == 3) { // 出國 Talk.say("你放棄了學業,踏上了桌球國手之路", 1); Talk.say("過五關斬六將", 1); Talk.say("終於成為了世界桌球王", 1); } else if (i == 4) { // 0分 game over Talk.say("輕輕的我走了", 1); Talk.say("正如我輕輕地來", 1); Talk.say("我揮一揮衣袖", 1); Talk.say("不帶走任何學分", 1); } else if (i == 5) { // final Talk.say("你完成了final project", 1); Talk.say("跟其他同學一起過了OOP", 1); Talk.say("不過大四還有更嚴苛的挑戰在等著你", 1); Talk.say("同學!加油吧!", 1); } }
/** Update - Method, implements double buffering */ public void update(Graphics g) { // initialize buffer if (dbImage == null) { dbImage = createImage(this.getSize().width, this.getSize().height); dbg = dbImage.getGraphics(); } // clear screen in background dbg.setColor(getBackground()); dbg.fillRect(0, 0, this.getSize().width, this.getSize().height); // draw elements in background dbg.setColor(getForeground()); paint(dbg); // draw image on the screen g.drawImage(dbImage, 0, 0, this); }
/* * This method creates and fills three arrays, Y, Cb, and Cr using the * input image. */ private void getYCCArray() { int[] values = new int[imageWidth * imageHeight]; int r; int g; int b; int y; int x; // In order to minimize the chance that grabPixels will throw an exception // it may be necessary to grab some pixels every few scanlines and process // those before going for more. The time expense may be prohibitive. // However, for a situation where memory overhead is a concern, this may be // the only choice. PixelGrabber grabber = new PixelGrabber( imageobj.getSource(), 0, 0, imageWidth, imageHeight, values, 0, imageWidth); MaxHsampFactor = 1; MaxVsampFactor = 1; for (y = 0; y < NumberOfComponents; y++) { MaxHsampFactor = Math.max(MaxHsampFactor, HsampFactor[y]); MaxVsampFactor = Math.max(MaxVsampFactor, VsampFactor[y]); } for (y = 0; y < NumberOfComponents; y++) { compWidth[y] = ((((imageWidth % 8) != 0) ? (((int) Math.ceil((double) imageWidth / 8.0)) * 8) : imageWidth) / MaxHsampFactor) * HsampFactor[y]; if (compWidth[y] != ((imageWidth / MaxHsampFactor) * HsampFactor[y])) { lastColumnIsDummy[y] = true; } // results in a multiple of 8 for compWidth // this will make the rest of the program fail for the unlikely // event that someone tries to compress an 16 x 16 pixel image // which would of course be worse than pointless BlockWidth[y] = (int) Math.ceil((double) compWidth[y] / 8.0); compHeight[y] = ((((imageHeight % 8) != 0) ? (((int) Math.ceil((double) imageHeight / 8.0)) * 8) : imageHeight) / MaxVsampFactor) * VsampFactor[y]; if (compHeight[y] != ((imageHeight / MaxVsampFactor) * VsampFactor[y])) { lastRowIsDummy[y] = true; } BlockHeight[y] = (int) Math.ceil((double) compHeight[y] / 8.0); } try { if (grabber.grabPixels() != true) { try { throw new AWTException("Grabber returned false: " + grabber.status()); } catch (Exception e) { String2.log(MustBe.throwableToString(e)); } } } catch (InterruptedException e) { } ; float[][] Y = new float[compHeight[0]][compWidth[0]]; float[][] Cr1 = new float[compHeight[0]][compWidth[0]]; float[][] Cb1 = new float[compHeight[0]][compWidth[0]]; float[][] Cb2 = new float[compHeight[1]][compWidth[1]]; float[][] Cr2 = new float[compHeight[2]][compWidth[2]]; int index = 0; for (y = 0; y < imageHeight; ++y) { for (x = 0; x < imageWidth; ++x) { r = ((values[index] >> 16) & 0xff); g = ((values[index] >> 8) & 0xff); b = (values[index] & 0xff); // The following three lines are a more correct color conversion but // the current conversion technique is sufficient and results in a higher // compression rate. // Y[y][x] = 16 + (float)(0.8588*(0.299 * (float)r + 0.587 * (float)g + 0.114 // * (float)b )); // Cb1[y][x] = 128 + (float)(0.8784*(-0.16874 * (float)r - 0.33126 * (float)g // + 0.5 * (float)b)); // Cr1[y][x] = 128 + (float)(0.8784*(0.5 * (float)r - 0.41869 * (float)g - // 0.08131 * (float)b)); Y[y][x] = (float) (((0.299 * (float) r) + (0.587 * (float) g) + (0.114 * (float) b))); Cb1[y][x] = 128 + (float) (((-0.16874 * (float) r) - (0.33126 * (float) g) + (0.5 * (float) b))); Cr1[y][x] = 128 + (float) (((0.5 * (float) r) - (0.41869 * (float) g) - (0.08131 * (float) b))); index++; } } // Need a way to set the H and V sample factors before allowing downsampling. // For now (04/04/98) downsampling must be hard coded. // Until a better downsampler is implemented, this will not be done. // Downsampling is currently supported. The downsampling method here // is a simple box filter. Components[0] = Y; // Cb2 = DownSample(Cb1, 1); Components[1] = Cb1; // Cr2 = DownSample(Cr1, 2); Components[2] = Cr1; }