после сохранения SD-карты, JPEG сохраняет искаженные - PullRequest
0 голосов
/ 11 декабря 2011

Итак, я сохраняю свою картинку на SD-карту, используя файлOutputStream - у меня есть изображение, отформатированное для jpeg, - но изображение сохраняется с искажением.это странно, потому что уменьшенное изображение является правильным представлением изображения, но когда оно открыто, оно представляет собой серию горизонтальных линий.

Вот некоторые фрагменты из моего кода:

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {
    if(previewing){
        camera.stopPreview();
        previewing=false;
    }
    if(camera!=null){
        try{
            camera.setPreviewDisplay(surfaceHolder);
            Camera.Parameters parameters = camera.getParameters();
            parameters.setPictureFormat(PixelFormat.JPEG);
            parameters.setPreviewSize(width, height);
            camera.setParameters(parameters);
            camera.startPreview();              
            previewing=true;
        } catch(IOException e){}
    }

}

и

    @Override
    public void onPictureTaken(byte[] data, Camera camera) {

        OutputStream outputStream;


        try{
            outputStream = new FileOutputStream(String.format("/sdcard/%d.jpg", System.currentTimeMillis())); //to sd card
            imageFileOS.write(data);
            imageFileOS.flush();
            imageFileOS.close();


        }catch(FileNotFoundException e){
            e.printStackTrace();
        }catch(IOException e){
            e.printStackTrace();
        }

    }
};

изображения (с горизонтально искаженным jpeg и собранным миниатюрой) в данный момент не загружаются на сервер - надеясь, что кто-то знает, что происходит.если нет, я могу попытаться загрузить фотографии позже.

1 Ответ

0 голосов
/ 12 декабря 2011

проблема решена:

в 2.2 У меня не было проблемы

в 2.3, изображение сохранялось искаженным - это было исправлено с помощью метода, который я назвал "getBestPictureSize", который в основномидентичный методу, который я использовал для получения наилучшего размера предварительного просмотра для формата экрана

, это метод для получения наилучшего размера изображения для устройства, на котором работает приложение ...

private Camera.Size getBestPicturSize(int width, int height)
{
        Camera.Size result=null;    
        Camera.Parameters p = camera.getParameters();
        for (Camera.Size size : p.getSupportedPictureSizes()) {
            if (size.width<=width && size.height<=height) {
                if (result==null) {
                    result=size;
                } else {
                    int resultArea=result.width*result.height;
                    int newArea=size.width*size.height;

                    if (newArea>resultArea) {
                        result=size;
                    }
                }
            }
        }
    return result;

}

это обратный вызов surfaceChanged, в котором описанный выше метод используется для правильного определения размера изображения, полученного в результате camera.takePicture (...);

private Camera.Size getBestPicturSize(int width, int height)
{
        Camera.Size result=null;    
        Camera.Parameters p = camera.getParameters();
        for (Camera.Size size : p.getSupportedPictureSizes()) {
            if (size.width<=width && size.height<=height) {
                if (result==null) {
                    result=size;
                } else {
                    int resultArea=result.width*result.height;
                    int newArea=size.width*size.height;

                    if (newArea>resultArea) {
                        result=size;
                    }
                }
            }
        }
    return result;

}

, вы также можете использовать этот метод определения размера изображения, чтобы получитьПредварительный размер, отключив строку:

for (Camera.Size size : p.getSupportedPictureSizes()) {

для

for (Camera.Size size : p.getSupportedPreviewSizes()) {

надеюсь, это кому-нибудь поможет, так как я потратил около 10 часов на то, чтобы эта функция не работала на моем2.3.4, но на моем 2.2

это, как говорится, при запуске getBestPictureSize на 2.2 вызывает принудительное закрытие.еще не понял, как я собираюсь справиться с этим

...