Android版 PNG转PGM

263 阅读1分钟

0 前言

直接开始,需要的自取。

1 Show Code

  • 图片转灰度数组
public static int[][] getPgmArray(Bitmap bitmap) {
    int w = bitmap.getWidth();
    int h = bitmap.getHeight();
    int[][] imgArray = new int[h][w];
    //读取顺序是从上到下,从左到右
    for (int i = 0; i < w; i++) {
        for (int j = 0; j < h; j++) {
            int p = bitmap.getPixel(i, j);
            int a = (p >> 24) & 0xff;
            int r = (p >> 16) & 0xff;
            int g = (p >> 8) & 0xff;
            int b = p & 0xff;
            int avg = (r + g + b) / 3;
            imgArray[j][i] = avg;
        }
    }
    return imgArray;
}
  • 拼接PGM
private static final String MAGIC = "P5";
private static final char COMMENT = '#';
private static final int MAXVAL = 255;

public static String write(final int[][] image, final File file, final int maxval) throws IOException {
    if (maxval > MAXVAL)
        throw new IllegalArgumentException("The maximum gray value cannot exceed " + MAXVAL + ".");
    }
    BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(file));
    try {
        stream.write(MAGIC.getBytes(StandardCharsets.UTF_8));
        stream.write("\n".getBytes());
        stream.write(Integer.toString(image[0].length).getBytes());
        stream.write(" ".getBytes());
        stream.write(Integer.toString(image.length).getBytes());
        stream.write("\n".getBytes());
        stream.write(Integer.toString(maxval).getBytes());
        stream.write("\n".getBytes());
        for (int i = 0; i < image.length; i++) {
            for (int j = 0; j < image[0].length; j++) {
                final int p = image[i][j];
                if (p < 0 || p > maxval) {
                    throw new IOException("Pixel value " + p + " outside of range [0, " + maxval + "].");    
                }
                stream.write(image[i][j]);
            }
        }
    } catch (Exception e) {
    
    } finally {
        stream.close();
    }
}

2 ChatGPT怎么写

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.os.Environment;

import java.io.File;
import java.io.FileOutputStream;

public class JpgToPgmConverter {

    public static void convertJpgToPgm(String jpgFileName, String pgmFileName) {
        // 获取JPG文件路径
        String path = Environment.getExternalStorageDirectory().getAbsolutePath()
                + File.separator + jpgFileName;
        File jpgFile = new File(path);

        try {
            // 读取JPG文件
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inPreferredConfig = Bitmap.Config.ARGB_8888;
            Bitmap bitmap = BitmapFactory.decodeFile(jpgFile.getAbsolutePath(), options);

            // 创建PGM文件
            File pgmFile = new File(Environment.getExternalStorageDirectory()
                    .getAbsolutePath() + File.separator + pgmFileName);

            // 将Bitmap对象转换为PGM文件
            FileOutputStream out = new FileOutputStream(pgmFile);
            out.write(String.format("P2\n%d %d\n255\n", bitmap.getWidth(), bitmap.getHeight())
                    .getBytes());
            for (int i = 0; i < bitmap.getHeight(); i++) {
                for (int j = 0; j < bitmap.getWidth(); j++) {
                    int color = bitmap.getPixel(j, i);
                    // 使用平均亮度计算灰度值
                    int gray = (Color.red(color) + Color.green(color) + Color.blue(color)) / 3;
                    out.write(String.format("%d ", gray).getBytes());
                }
                out.write("\n".getBytes());
            }
            out.flush();
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

  • 用GPT补充一个PGM转PNG/JPG
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Environment;
import android.util.Log;

import java.io.File;
import java.io.FileOutputStream;

public class PgmToPngConverter {

    public static void convertPgmToPng(String pgmFileName, String pngFileName) {
        // 获取PGM文件路径
        String path = Environment.getExternalStorageDirectory().getAbsolutePath()
                + File.separator + pgmFileName;
        File pgmFile = new File(path);

        try {
            // 读取PGM文件
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inPreferredConfig = Bitmap.Config.ARGB_8888;
            Bitmap bitmap = BitmapFactory.decodeFile(pgmFile.getAbsolutePath(), options);

            // 创建PNG文件
            File pngFile = new File(Environment.getExternalStorageDirectory()
                    .getAbsolutePath() + File.separator + pngFileName);

            // 将Bitmap对象转换为PNG文件
            FileOutputStream out = new FileOutputStream(pngFile);
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
            out.flush();
            out.close();
        } catch (Exception e) {
            Log.e("PgmToPngConverter", e.getMessage());
        }
    }
}