3

「グレースケールビットマップ」(1バイト-> 1ピクセル)に対応するバイトの配列があり、この画像のPNGファイルを作成する必要があります。

以下の方法は機能しますが、私が使用しているビットマップはARGB_8888ビットマップであり、1バイトではなく4バイト/ピクセルを使用するため、作成されるpngは巨大です。

ARGB_8888とは異なる他のBitmap.Configで動作させることができませんでした。おそらくALPHA_8が必要なのですが、それを機能させることができませんでした。

他のいくつかの投稿に含まれているtoGrayScaleメソッド(AndroidでビットマップをGrayScaleに変換する)も試しましたが、サイズに関して同じ問題があります。

public static boolean createPNGFromGrayScaledBytes(ByteBuffer grayBytes, int width,
        int height,File pngFile) throws IOException{

    if (grayBytes.remaining()!=width*height){
        Logger.error(Tag, "Unexpected error: size mismatch [remaining:"+grayBytes.remaining()+"][width:"+width+"][height:"+height+"]", null);
        return false;
    }
    Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    // for each byte, I set it in three color channels.
    int gray,color;
    int x=0,y=0;        
    while(grayBytes.remaining()>0){

        gray = grayBytes.get();
        // integer may be negative as byte is signed. make them positive. 
        if (gray<0){gray+=256;}

        // for each byte, I set it in three color channels.
        color= Color.argb(-1, gray, gray, gray);


        bitmap.setPixel(x, y, color);
        x++;
        if (x==width){
            x=0;
            y++;
        }           
    }
    FileOutputStream fos=null;

    fos = new FileOutputStream(pngFile);
    boolean result= bitmap.compress(Bitmap.CompressFormat.PNG,100,fos);
    fos.close();
    return result;
}       

編集:生成されたファイルへのリンク(意味がないように見えるかもしれませんが、ランドンデータで作成されただけです)。 http://www.tempfiles.net/download/201208/256402/huge_png.html

どんな助けでも大歓迎です。

4

2 に答える 2

5

お気づきのように、グレースケール画像をRGBとして保存するとコストがかかります。輝度データがある場合は、RGBPNGではなくグレースケールPNGとして保存することをお勧めします。

Androidフレームワークで利用可能なビットマップと画像の機能は、フレームワークとUIコンポーネントでサポートされている画像形式の読み取りと書き込みを対象としています。グレースケールPNGはここには含まれていません。

AndroidでグレースケールPNGを保存する場合は、 http://code.google.com/p/pngj/などのライブラリを使用する必要があります。

于 2012-08-09T01:05:00.343 に答える
2

OPENCV for Androidライブラリを使用している場合は、ライブラリを使用してバイナリデータをpngファイルに保存できます。私のやり方は次のとおりです。jniの部分で、データがバイト配列で始まるMatを設定します。

jbyte* _ByteArray_BrightnessImgForOCR = env->GetByteArrayElements(ByteArray_BrightnessImgForOCR, 0);
Mat img(ByteArray_BrightnessImgForOCR_h, ByteArray_BrightnessImgForOCR_w, CV_8UC1, (unsigned char *) _ByteArray_BrightnessImgForOCR);

そしてそれをpngファイルに書き込みます。

imwrite("/mnt/sdcard/binaryImg_forOCR.png", img);

もちろん、OpenCVとJavaネイティブコーディングに慣れるには少し時間がかかる必要があります。OpenCV for Androidの例に従うと、すぐに習得できます。

于 2012-12-31T20:17:57.903 に答える