это мой первый раз здесь.Надеюсь, что кто-то может дать нам подсказку!
Мы застряли при преобразовании изображений в Google App Engine с помощью Java.Мы в основном хотим добиться следующего:
1) Создать QRCode с помощью Google Chartapi - ГОТОВО 2) Используйте urlfetch, чтобы получить только что сгенерированный qrcode, и используйте pngw / pngr (библиотека изображений для appengine), чтобы прочитать и изменитьпикселей на изображении - ВЫПОЛНЕНО
Теперь мы понятия не имеем, как:
3) сохранить измененное изображение в хранилище больших двоичных объектов, чтобы затем можно было отображать его на экране с помощью API-интерфейса blobstore.* мы использовали библиотеку локально, а локальное сохранение C: \ test.png работает просто отлично.
Код приведен ниже: * Мы использовали библиотеку pngr, которая использует InputStream для PngReader вместо File.Работает App Engine для чтения и изменения попиксельных данных из PNG.http://github.com/jakeri/pngj-for-Google-App-Engine
package com.qrcode.server;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.vobject.appengine.java.io.InputStream;
import ar.com.hjg.pngj.ImageLine;
import ar.com.hjg.pngj.PngReader;
import ar.com.hjg.pngj.PngWriter;
public class QrTest extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
try {
URL url = new URL("http://chart.apis.google.com/chart?
cht=qr&chs=400x400&chl=http://google.com&chld=L%7C0");
PngReader pngr;
pngr = new PngReader(url.openStream());
PngWriter pngw = new PngWriter("Name", pngr.imgInfo);
pngw.setOverrideFile(true); // allows to override writen file if
it already exits
//pngw.prepare(pngr); // not necesary; but this can copy some
informational chunks from original
int channels = pngr.imgInfo.channels;
if(channels<3) throw new RuntimeException("Only for truecolour
images");
for (int row = 0; row < pngr.imgInfo.rows; row++) {
ImageLine l1 = pngr.readRow(row);
for(int j=0;j<pngr.imgInfo.cols;j++){
String color_filter = Long.toHexString(l1.getPixelRGB8(j));
if (color_filter.equals("0")){
// CHANGE THE COLOR FOR EACH PIXEL (ROW X COLUMN)
l1.scanline[j*channels]= 250;
//SHOW THE HEX COLOR FOR EACH PIXEL OF THE IMAGE
String out = row +" x " + j +" - " +
Long.toHexString(l1.getPixelRGB8(j));
response.getWriter().println(out);
//SET THE NEW COLOR FOR EACH COLUMN IN
}else{
String out = " ==== NOT BLACK ===";
out ="\n"+ row +" x " + j +" - " +
Long.toHexString(l1.getPixelRGB8(j));
response.getWriter().println(out);
}
}
//pngw.writeRow(l1);
}
pngr.end();
pngw.end();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}