我试图将位图保存到文件,然后将其保存在SD卡上.这是我的代码:
String path = Environment.getExternalStorageDirectory().toString();
File file = new File(path, "Jhs"+".jpg");
file.mkdir();
OutputStream fOut;
try {
fOut = new FileOutputStream(file);
BitmapMatrix convMatrix = new BitmapMatrix(0);
convMatrix.result.compress(Bitmap.CompressFormat.JPEG, 100, fOut);
fOut.flush();
fOut.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
此代码也在一个不扩展Activity的类中.我只是给出了这个信息,认为可能存在一些问题.这是我的LogCat
05-01 18:00:22.555: W/System.err(31392): java.io.FileNotFoundException: /mnt/sdcard/Jhs.jpg (Permission denied)
05-01 18:00:22.555: W/System.err(31392): at org.apache.harmony.luni.platform.OSFileSystem.open(Native Method)
05-01 18:00:22.555: W/System.err(31392): at dalvik.system.BlockGuard$WrappedFileSystem.open(BlockGuard.java:232)
05-01 18:00:22.555: W/System.err(31392): at java.io.FileOutputStream.<init>(FileOutputStream.java:94)
05-01 18:00:22.555: W/System.err(31392): …Run Code Online (Sandbox Code Playgroud) 有没有办法将位图(表示从地址簿中检索的联系人照片)设置为ActionBarSherlock中的主页图标.
我想将"icon"的字符串转换为字节数组,然后将其转换为Bitmap.问题是模拟器中的图像没有显示.我想我做得不对,但我知道为什么.非常感谢你的帮助.提前致谢
这是我的JSON数据:
{
"project": [
{
"abbreviation": "abd",
"customer": "customer1",
"description": "description1",
"icon": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAC4UlEQVR42sXTXUhTYRgH8NNNXkTdmPlRpltqalgXZlB4hCC6C8VyYjErtbCoNLJiqQmOtqmYCkUXdhNEGSHYuVXCj81N58dcO+rOPt3c2dnOWTubeSPUv6PZx1U3XfTAj4f3gf/zXL0E8d+LoqgEw+RkvnnOWmi22H6Ytx4bHRtLSt2XSKhUqr8vkMKFYS5I8y5LhGemBYEx8xHPp3CICxpoevFcf3//LrVanaDRaBK0Wu0WnU632XdK8x3E1MxcSZR1Cez7ewgM1IEdqEWYasW6yCMajQqBQGDE5/N98Hq9lNvtppxOJ8UwDEXT9LuJiYmThMlkIuMxUVgXQ1KIw5doEGufOcRjMYiiiEgkAp7nwXEcWJaF3+/HysoKnC7XxtTUdA1hNBrJzUvx+Bpi8Thisbh0+XcwFAohyIUQYANS0A2P2wGXyw6GWdyYMo7VEXq9nuR5QSpeCnDgw0GEQ6x0MQA24MeqzwPvwhiWXzeD7q6CrecibL2XYO2s+DrzoGCEGNcbilmfk3e8fYSlXiWWn13F8vMaLD27gsU+JWydFbDcLcRsVTJmFEmYqdym2AuzcreDGNWbij02A79w/wTmlOmYqz74y6zypwzMVmdi9vIfqjNgrk0cJz5OmIoZI8Vb7kkLruVK8rblbpm/dhjz1yX1ObBsuvHD5tt8K3WQGB43FtPDr3hLYxEW6o/CWl8A280jWLydh+XGHDBNWXA+lMOpksHVnAlnSyYcrTLYW+SwtqS9kBZMkrahPoG+Uwh7w1G4m/LgV2Uh2CZDWJ0BQZOOSMd+RDpTIXSlgJdwnWlY7TjwjdGmtRFvBoeK9C9b7fMNx2J0U67oeHRI9D6WiavtcjH4JEvktBKdXJIusrpU0a9NFj2aFNHefiBsUGVcJk6fObunqbq0SF2aX6IpyyY7yrPIrvPZZHdFDtmjyCV7K/O3+lOFNFPIya4KGdlxQUa2l8lPlR9PS/nnz/gdnPcTQcpv7vgAAAAASUVORK5CYII=",
"name": "projectname1",
"plannedEndDate": "2012-05-25T00:00:00+01:00",
"plannedStartDate": "2012-05-23T00:00:00+01:00",
"projectStatus": {
"name": "Opened"
},
"realEndDate": "2012-05-25T00:00:00+01:00",
"realStartDate": "2012-05-23T00:00:00+01:00"
}
]
}
Run Code Online (Sandbox Code Playgroud)
我这样做了,但它不起作用:
// convert String to byte[]
String stringToConvert = project.getIcon();
byte[] theByteArray = stringToConvert.getBytes();
// convert Byte[] to Bitmap
Bitmap bm = BitmapFactory.decodeByteArray(theByteArray,
0, theByteArray.length);
DisplayMetrics dm = new DisplayMetrics();
holder.imageIcon.setMinimumHeight(dm.heightPixels);
holder.imageIcon.setMinimumWidth(dm.widthPixels);
holder.imageIcon.setImageBitmap(bm);
Run Code Online (Sandbox Code Playgroud) 我做了一个有很大背景的应用程序.它在Nexus 7上完美运行,但在我的Galaxy Nexus上,背景消失了,并在logcat中给出了错误:位图太大而无法上传到纹理(...).
我已经阅读了这篇文章并使用了那里的代码.我用来设置背景的代码是这样的:
Display display = getWindowManager().getDefaultDisplay();
width = display.getWidth();
height = display.getHeight();
//-------------------------------------------------------------------------------------------------------------
ImageView achtergrond = (ImageView)findViewById(R.id.achtergrond);
achtergrond.setImageBitmap(decodeSampledBitmapFromResource(getResources(), R.drawable.achtergrond, width, height));
} (...)
public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
int reqWidth, int reqHeight) {
// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(res, resId, options);
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
return BitmapFactory.decodeResource(res, resId, options); …Run Code Online (Sandbox Code Playgroud) 我已将位图图像转换为字符串以保存它:
............
Bitmap photo = extras.getParcelable("data");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
photo.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] b = baos.toByteArray();
String encodedImage = Base64.encodeToString(b, Base64.DEFAULT);
Run Code Online (Sandbox Code Playgroud)
然后我从字符串中检索位图以设置活动的背景,如下所示:
byte[] temp = Base64.decode(encodedImage, Base64.DEFAULT);
Options options = new BitmapFactory.Options();
options.inScaled = false;
Bitmap bitmap = BitmapFactory.decodeByteArray(temp, 0,
temp.length, options);
Drawable d = new BitmapDrawable(getResources(), bitmap);
getWindow().setBackgroundDrawable(d);
Run Code Online (Sandbox Code Playgroud)
一切正常,但图像质量大大降低.如何保持图像质量与原始图像相同?我在这里做错了什么,降低了质量?
我是android新手.我正在使用我在youtube上找到的教程.该应用程序在画布上绘制一个球的图片,然后对角移动.我想让球移动一圈.我已经找到了一些关于圆周运动基本数学的信息,但是我在实现它时遇到了麻烦.有人可以看看我的代码并告诉我我做错了什么.谢谢.
这是我的代码:
public class DrawingTheBall extends View {
Bitmap bball;
int x,y;
public DrawingTheBall(Context context) {
super(context);
// TODO Auto-generated constructor stub
bball = BitmapFactory.decodeResource(getResources(), R.drawable.blueball);
x = 0;
y = 0;
}
@Override
public void onDraw(Canvas canvas){
super.onDraw(canvas);
Rect ourRect = new Rect();
ourRect.set(0, 0, canvas.getWidth(), canvas.getHeight()/2);
float a = 10;
float b = 10;
float r = 20;
double theta = 0;
theta = Math.toRadians(45);
Paint blue = new Paint();
blue.setColor(Color.BLUE);
blue.setStyle(Paint.Style.FILL);
canvas.drawRect(ourRect, blue);
if(x < canvas.getWidth()){
//x …Run Code Online (Sandbox Code Playgroud) 根据MSDN:
如果nWidthSrc和nWidthDest参数的符号或者nHeightSrc和nHeightDest参数不同,StretchBlt将创建位图的镜像.
所以我尝试创建颠倒的图像.我有一个类看起来像这样:
class Picture
{
private:
HBITMAP bmp; //Bitmap
HDC pdc; //Device context
short int w; //Weidth of bitmap
short int h; //Heighth of bitmap
public:
short int x;
short int y;
void draw(HDC);
void upside_down();
}
Run Code Online (Sandbox Code Playgroud)
我有这个方法:
void Picture::upside_down()
{
HDC dc = CreateCompatibleDC(pdc);
HBITMAP bmap = CreateCompatibleBitmap(pdc, w, h);
SelectObject(dc, bmap);
BitBlt(dc, 0, 0, w, h, pdc, 0, 0, SRCCOPY);
StretchBlt(pdc, 0, 0, w, h, dc, 0, 0, w, -h, SRCCOPY);
DeleteDC(dc);
DeleteObject(bmap);
}
Run Code Online (Sandbox Code Playgroud)
但它不起作用,没有任何反应.我想知道它是否具有DC兼容性,我总是在理解其背后的逻辑时遇到问题.
那么,我应该怎么做才能让我的位图翻转?
我正在开发一个应用程序,用户可以通过我的CameraActivity(SurfaceView + Camera)拍摄照片并保存.之后,将处理位图.
说让我带你了解细节.图片拍摄时间:
mCamera.takePicture(null, null, new PictureCallback() {...}
Run Code Online (Sandbox Code Playgroud)
我没有指定.jpeg质量.
使用HTC One S进行测试,拍摄照片然后保存.图片大小永远不会超过100kb
使用三星GT-I9000进行测试,拍摄照片然后保存,但这里的差异是尺寸,超过1,2Mb.
因为我需要处理后面的位图,当我尝试解码bimap来处理它时,我对GT-I9000 有一些OutOfMemory问题:
try {
FileInputStream fis = new FileInputStream(new File(imagePath));
Bitmap savedPicture = BitmapFactory.decodeStream(fis);
Run Code Online (Sandbox Code Playgroud)
我试图改变,Camera Parameters .setJpegQuality(quality)但我没有产生巨大的变化.
图像将占用所有的屏幕大小,我使用这种方法有效地加载大位图 它工作,我摆脱了OutOfMemory Exceptions但我仍然有一些问题:
设备之间的文件大小差异?我认为HTC One S比GT-I9000好,为什么不保存更大的图片呢?
图像分辨率,HTC One S 640x480,GT-I9000 2560x1920为什么?那回答第一个问题,但为什么会这样呢?
谢谢你的时间 ;)
下面的代码从窗体上的控件创建一个位图,然后显示一个保存对话框以保存为JPEG.任何人都可以帮助使用iTextSharp将Bitmap bm保存为PDF吗?
Bitmap bm = null;
bm = new Bitmap(this.RCofactorTBS.SelectedTab.Width, this.RCofactorTBS.SelectedTab.Height);
this.RCofactorTBS.SelectedTab.DrawToBitmap(bm, this.RCofactorTBS.SelectedTab.ClientRectangle);
SaveFileDialog dialog = new SaveFileDialog();
dialog.Filter = "JPEG|*.jpeg";
dialog.Title = "Save Test As Jpeg";
dialog.ShowDialog();
if (dialog.FileName != "" && bm != null)
{
bm.Save(dialog.FileName);
}
Run Code Online (Sandbox Code Playgroud) 我从相机捕获图像,然后保存它做sqlite数据库.
之后,我允许用户裁剪它.整个过程质量非常差.
我在Nexus7上测试它,我知道它的前置摄像头很差,但是在裁剪应用程序打开后,图片非常小.在作物活动中它需要1/5的creen,我不知道为什么.
这会发生什么onActivityResult(拍摄拍摄的照片)
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == CAMERA_REQUEST && resultCode == Activity.RESULT_OK) {
Bitmap bitmap = (Bitmap) data.getExtras().get("data");
String path = Images.Media.insertImage(getActivity().getContentResolver(), bitmap, "Title", null);
Uri imageUri = Uri.parse(path);
if (!doCrop(imageUri)) saveNewAvatar(bitmap);
}
}
Run Code Online (Sandbox Code Playgroud)
这是doCrop(Uri uri)方法:
private void doCrop(final Uri imageUri) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setType("image/*");
List<ResolveInfo> list = getActivity().getPackageManager().queryIntentActivities( intent, 0 );
int size = list.size();
intent.setData(imageUri);
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("scale", true); …Run Code Online (Sandbox Code Playgroud)