package com.img.rabbit.utils; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileWriter; import java.io.IOException; import java.io.OutputStream; import java.io.PrintWriter; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Color; import android.net.Uri; import android.os.Environment; import android.provider.MediaStore; import android.widget.Toast; public class Bitmap2SVG { public static boolean convert(Context context, File output, Bitmap input){ Bitmap2SVG svg; try { svg = new Bitmap2SVG( new PrintWriter( new BufferedWriter( new FileWriter( output ) ) ), true ); } catch (IOException e) { return false; } svg.printSVGHeader( input.getWidth(), input.getHeight() ); svg.printSVGBody( input ); svg.printSVGFooter(); saveToGallery(context, output, "displayName.svg"); return true; } private boolean trc_del; private PrintWriter pw; private int w, h; private Bitmap2SVG( PrintWriter pw, boolean trc_delete ) { this.pw = pw; trc_del = trc_delete; } private void printSVGHeader( int width, int height ) { pw.println( "" ); pw.print( "" ); } private void printSVGFooter() { pw.println( "" ); pw.close(); } private void printSVGBody( Bitmap bmp ) { int x, y, c, a; w = bmp.getWidth(); h = bmp.getHeight(); for ( y = 0 ; y < h ; ++y ) { for ( x = 0 ; x < w ;++x ) { c = bmp.getPixel( x, y ); a = Color.alpha( c ); if ( trc_del && a == 0 ){ continue; } printDot( x, y, rgb( c ), a ); } } } private void printDot( int x, int y, String rgb, int a ) { pw.print( "" ); } private static String rgb( int c ) { return String.format( "%02x%02x%02x", Color.red( c ), Color.green( c ), Color.blue( c ) ); } public static void saveToGallery(Context context, File svgFile, String displayName) { ContentValues values = new ContentValues(); // 关键点:显式指定 MIME 类型为 SVG values.put(MediaStore.Images.Media.MIME_TYPE, "image/svg+xml"); values.put(MediaStore.Images.Media.DISPLAY_NAME, displayName + ".svg"); values.put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_PICTURES); ContentResolver resolver = context.getContentResolver(); Uri uri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); if (uri != null) { try (OutputStream os = resolver.openOutputStream(uri); FileInputStream fis = new FileInputStream(svgFile)) { byte[] buffer = new byte[1024]; int len; while ((len = fis.read(buffer)) != -1) { os.write(buffer, 0, len); } // 此时文件已带上正确的 MIME 类型存入相册 Toast.makeText(context, "SVG已保存", Toast.LENGTH_SHORT).show(); } catch (IOException e) { e.printStackTrace(); } } } }