在android中保存和发送图像时图像大小的差异

在android中保存和发送图像时图像大小的差异,android,android-intent,android-bitmap,Android,Android Intent,Android Bitmap,我在activity1中的图像以5.8kb的大小保存在内部存储器中,我使用额外的意图流从同一活动发送相同的图像,并且在接收器端变为15kb。这背后的逻辑是什么 Intent intent = new Intent(Intent.ACTION_SEND); intent.setData(Uri.parse("mailto:")); intent.setType("imge/png"); intent.putExtra(Intent.EXTRA_EMA

我在activity1中的图像以5.8kb的大小保存在内部存储器中,我使用额外的意图流从同一活动发送相同的图像,并且在接收器端变为15kb。这背后的逻辑是什么

Intent intent = new Intent(Intent.ACTION_SEND);
        intent.setData(Uri.parse("mailto:"));
        intent.setType("imge/png");
        intent.putExtra(Intent.EXTRA_EMAIL, to); //user entered email address in edittext view.
        intent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
        intent.putExtra(Intent.EXTRA_TEXT, "Message");
        intent.putExtra(Intent.EXTRA_STREAM, bitmapUri);
        startActivity(intent);
        saveImage(bmap);

    public void saveImage(Bitmap bitmap){
    String root = Environment.getExternalStorageDirectory().toString();
    File myDir = new File(root + "/My Folder");
    String receiverN = receiverName.getText().toString();

    myDir.mkdirs();
    //name convention--------------------------------------------->>
    Calendar c = Calendar.getInstance();
    String month, day, year, hour, minute, second;
    month = ""+ (c.get(Calendar.MONTH)+1);
    day = "" + c.get(Calendar.DAY_OF_MONTH);
    year = "" + c.get(Calendar.YEAR);
    hour = ""+c.get(Calendar.HOUR_OF_DAY);
    if(hour.equals("0")) hour = "0"+hour;
    minute = "" + c.get(Calendar.MINUTE);
    int seconds = c.get(Calendar.SECOND);
    if (seconds<10) second = "0"+ seconds;
    else second = ""+seconds;

    String fname = receiverN + "-" + hour + ":" + minute + ":" + second + "_"  + month + "-" + day + "-" + year +".png";
    //name convention ends----------------------------------------->>

    File file = new File (myDir, fname);


    if (file.exists ()) file.delete ();
    try {
        FileOutputStream out = new FileOutputStream(file);
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
        out.flush();
        out.close();
        String[] paths = {file.toString()};
        String[] mimeTypes = {"/image/png"};
        MediaScannerConnection.scanFile(MyClass.this, paths, mimeTypes, null);
        Toast.makeText(MyClass.this, "Image Saved", Toast.LENGTH_LONG).show();

    } catch (Exception e) {
        e.printStackTrace();
    }
}
Intent Intent=新意图(Intent.ACTION\u SEND);
setData(Uri.parse(“mailto:”);
intent.setType(“imge/png”);
intent.putExtra(intent.EXTRA_电子邮件,收件人)//用户在edittext视图中输入了电子邮件地址。
intent.putExtra(intent.EXTRA_SUBJECT,“SUBJECT”);
intent.putExtra(intent.EXTRA_文本,“消息”);
intent.putExtra(intent.EXTRA_流,位图URI);
星触觉(意向);
保存图像(bmap);
公共void保存图像(位图){
String root=Environment.getExternalStorageDirectory().toString();
File myDir=新文件(root+“/myfolder”);
字符串receiverN=receiverName.getText().toString();
myDir.mkdirs();
//名称约定------------------------------------------>
Calendar c=Calendar.getInstance();
字符串月、日、年、时、分、秒;
月份=”+(c.get(日历月份)+1);
day=“”+c.get(日历,每月的第天);
年份=”“+c.get(日历年);
hour=”“+c.get(日历中的小时);
如果(小时等于(“0”)小时=“0”+小时;
分钟=”+c.get(日历分钟);
int seconds=c.get(日历秒);
如果(秒>
File File=新文件(myDir,fname);
如果(file.exists())file.delete();
试一试{
FileOutputStream out=新的FileOutputStream(文件);
compress(bitmap.CompressFormat.PNG,100,out);
out.flush();
out.close();
字符串[]路径={file.toString()};
字符串[]mimeTypes={“/image/png”};
MediaScannerConnection.scanFile(MyClass.this,路径,mimeTypes,null);
Toast.makeText(MyClass.this,“图像已保存”,Toast.LENGTH_LONG.show();
}捕获(例外e){
e、 printStackTrace();
}
}
这是intent extra stream的代码,它接受我的位图URI并正确发送图像,保存方法也在那里。保存为5.8kb 960*960,发送为15kb,960*960。我希望两次的大小相同。

在保存图像(位图位图)方法中,您使用了“位图.compress(位图.CompressFormat.PNG,100,out)”

根据压缩方法中使用的参数,图像大小会有所不同。图像质量可以设置为0(低)到100(高)。如果更新质量,则可以保持图像大小。

在保存图像(位图位图)方法中,您使用了“Bitmap.compress(Bitmap.CompressFormat.PNG,100,out)”


根据压缩方法中使用的参数,图像大小会有所不同。图像质量可以设置为0(低)到100(高)。如果更新质量,图像大小可以保持不变。

前面的答案是正确的。要检查这一点,只需在发送图像之前使用方法saveImage()

FileOutputStream out = new FileOutputStream(file);
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
    out.flush();
    out.close();
    String[] paths = {file.toString()};
    String[] mimeTypes = {"/image/png"};
    MediaScannerConnection.scanFile(MyClass.this, paths, mimeTypes, null);
    Toast.makeText(MyClass.this, "Image Saved", Toast.LENGTH_LONG).show();
更新:


前面的答案是正确的。要检查这一点,只需在发送图像之前使用您的方法saveImage()

FileOutputStream out = new FileOutputStream(file);
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
    out.flush();
    out.close();
    String[] paths = {file.toString()};
    String[] mimeTypes = {"/image/png"};
    MediaScannerConnection.scanFile(MyClass.this, paths, mimeTypes, null);
    Toast.makeText(MyClass.this, "Image Saved", Toast.LENGTH_LONG).show();
更新:



你能发布
额外意图流的实现吗
?添加了代码,希望这会很清楚。它会打开哪个邮件应用程序?你尝试过其他邮件应用程序吗?位图可能会在接收端用不同的算法压缩。我用Gmail打开,附带的图像大小显示为15kb…你确定,我在手机上也做了同样的事情吗?我不知道想想Gmail压缩图像你可以发布额外的意图流的实现吗?添加代码,希望这会很清楚。它打开了哪个邮件应用程序?你尝试过其他邮件应用程序吗?位图可能在接收器端用不同的算法压缩。我用Gmail打开,附带的图像大小显示15kb…你确定,我做了s吗在我的手机中使用ame?我不认为Gmail会压缩图像。为什么呢?图像会被保存为5.8KB,质量为100,与用户通过Gmail发送的图像相同,这会增加图像的大小。正是这样……这张图像在内部存储中被保存为5.8KB,在通过Gmail发送时被保存为15kb……这让我非常头疼……试图找到它d到处都有,但大小不同的研究有,但大小不同的一个…为什么?图像保存为5.8KB,质量为100,用户通过Gmail发送的相同图像增加了图像的大小。正是这样的情况…这个图像在内部存储中保存为5.8KB,在通过Gmail发送时保存为15kb…给了我很多头痛e、 …尝试到处查找,但调整大小的研究存在,但大小不同…更新质量意味着更改变量中的整数值?是的,您需要根据需要更改0到100之间的值。0表示低质量,100表示高质量。否,如果压缩为PNG格式,质量将被忽略。请参阅文档的质量参数如果压缩为png格式,则更改整数值没有任何用处,而只有压缩为JPEG格式时,它才会对位图大小产生影响。存储的位图和邮寄的位图的大小不会有任何不同…这是我尝试过的代码的链接..[Github]()更新质量意味着更改变量中的整数值?是的,您需要根据需要更改0和100之间的值。0表示低质量,100表示高质量。否,如果压缩为PNG格式,质量将被忽略。请参阅的质量参数文档,如果压缩为PNG格式,则没有任何用处在更改整数值时,它仅在压缩为JPEG格式时才对位图大小产生影响。存储的位图和邮寄的位图的大小不会有任何不同…以下是我尝试的代码的链接..[Github]()