图片压缩保存

         
         因为图片存储特性,当前内存读取Byte构造的Bitmap如不存储则只能使用一次。
因为图片大小缩放是图片自生属性操作。图片质量变化,属于动态像素模糊。
所以图片质量缩放对应的内存输出流不能保留。则在存储压缩图片的时候,需
要再次进行质量压缩。

第一:我们先看一下文件命名:

 

    private static char HEX_DIGITS[] = {'0', '1', '2', '3', '4', '5', '6',
            '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};

    private static String toHexString(byte[] b) {
        StringBuilder sb = new StringBuilder(b.length * 2);
        for (int i = 0; i < b.length; i++) {
            sb.append(HEX_DIGITS[(b[i] & 0xf0) >>> 4]);
            sb.append(HEX_DIGITS[b[i] & 0x0f]);
        }
        return sb.toString();
    }

第二:我们来压缩保存图片:
 /** 保存图片到本地路径 */
    public String saveFile(Bitmap image, int limitKB) {
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            image.compress(Bitmap.CompressFormat.JPEG, 100, baos);
            int options = 100;
            while (baos.size() / 1024 > limitKB) {
                baos.reset();
                image.compress(Bitmap.CompressFormat.JPEG, options, baos);
                options -= 10;
            }
            byte[] tempBytes = baos.toByteArray();
            MessageDigest md5 = MessageDigest.getInstance("MD5");                   // md5图片获得md5码
            md5.update(tempBytes);
            String imageMd5 = toHexString(md5.digest()).toLowerCase();

            ByteArrayOutputStream arrayOutputStream = null;
            String imageRoot = FilePathUtils.getUserEditPath();
            String filename = imageRoot + imageMd5 + ".jpg";
            FileOutputStream outputStream = new FileOutputStream(new File(filename));
            arrayOutputStream = new ByteArrayOutputStream();
            arrayOutputStream.write(tempBytes);
            arrayOutputStream.writeTo(outputStream);
            return filename;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

你可以使用C#中的System.Drawing命名空间来实现WinForm图片压缩保存图片的功能。下面是一个简单的示例代码,演示了如何使用质量压缩保存图片。 ```csharp using System; using System.Drawing; using System.Drawing.Imaging; using System.Windows.Forms; namespace ImageCompression { public partial class MainForm : Form { public MainForm() { InitializeComponent(); } private void btnCompress_Click(object sender, EventArgs e) { // 选择图片文件 OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "Image Files (*.jpg, *.png, *.bmp)|*.jpg;*.png;*.bmp"; if (openFileDialog.ShowDialog() == DialogResult.OK) { // 加载图片 Image image = Image.FromFile(openFileDialog.FileName); // 设置压缩质量(1-100范围内) int compressionQuality = 50; // 创建一个EncoderParameters对象,用于设置图像的压缩质量 EncoderParameters encoderParams = new EncoderParameters(1); encoderParams.Param[0] = new EncoderParameter(Encoder.Quality, compressionQuality); // 获取JPEG编码器 ImageCodecInfo jpegEncoder = GetEncoder(ImageFormat.Jpeg); // 设置保存路径 SaveFileDialog saveFileDialog = new SaveFileDialog(); saveFileDialog.Filter = "JPEG Image|*.jpg"; if (saveFileDialog.ShowDialog() == DialogResult.OK) { // 保存压缩后的图片 image.Save(saveFileDialog.FileName, jpegEncoder, encoderParams); MessageBox.Show("图片保存成功!"); } } } // 获取指定格式的编码器 private static ImageCodecInfo GetEncoder(ImageFormat format) { ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders(); foreach (ImageCodecInfo codec in codecs) { if (codec.FormatID == format.Guid) { return codec; } } return null; } } } ``` 请注意,此示例仅展示了基本的图片压缩保存功能。你可以根据你的需要进行修改和扩展。另外,为了让上述代码能够正常运行,你需要在Visual Studio中创建一个Windows Forms应用程序,并将上述代码放入主窗体类中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值