Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Russtem81
3 / 3 / 1
Регистрация: 15.10.2015
Сообщений: 45
#1

Загрузка больших изоражений - Программирование Android

24.10.2015, 17:59. Просмотров 174. Ответов 0
Метки нет (Все метки)

Уточните классы и методы ч/з которые работает стандартная галерея.

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

http://developer.android.com/intl/ru...ad-bitmap.html
этот вариант не подходит т.к. картинка загружается статически и нет возможности ее масштабировать без потери качества масштабируемого кадра как в галереи.
Галерея какими то методами переваривает большие разрешения и масштабирует.
Методы галереи позволяют загружать сколь угодно большие изображения в ограниченное ресурсом представление устанавливается ImageView при зумме в этом же ограниченном представлении пересчитывается Bitmap, качество картинки начинает ухудшатся когда первоисточник не может предоставить необходимое количество пикселей начинаются всяческие математически методы типа интерполяции и прочие гадости, не писать же это все с нуля.
Bertrand Meyer не просто так же задвигал свои теории.

Добавлено через 7 часов 46 минут
лучшее что нашлось это
http://www.c-sharpcorner.com/UploadF...android-using/
но не идеал, представленный пример реализует масштаб картинки, движение по картинке, но есть большой минус при выполнении операции ZOOM не подгружается новая матрица Bitmap. В чистом виде метод setImageBitmap дает OUTMemory при загрузке больших картинок, кто подскажет как это исправить.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
public class TouchImageView extends ImageView {  
    Matrix matrix;  
    // We can be in one of these 3 states  
    static final int NONE = 0;  
    static final int DRAG = 1;  
    static final int ZOOM = 2;  
  
    int mode = NONE;  
 
    // Remember some things for zooming  
    PointF last = new PointF();  
    PointF start = new PointF();  
    float minScale = 1f;  
    float maxScale = 3f;  
    float[] m;
    int viewWidth, viewHeight;  
  
    static final int CLICK = 3;  
  
    float saveScale = 1f;  
  
    protected float origWidth, origHeight;  
  
    int oldMeasuredWidth, oldMeasuredHeight;  
 
    ScaleGestureDetector mScaleDetector;  
 
    Context context;  
 
    public TouchImageView(Context context) {  
        super(context);  
        sharedConstructing(context);  
    } 
 
    public TouchImageView(Context context, AttributeSet attrs) {  
        super(context, attrs);  
        sharedConstructing(context);  
    }  
  
    private void sharedConstructing(Context context) {  
  
        super.setClickable(true);  
  
        this.context = context;  
  
        mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());  
  
        matrix = new Matrix();  
  
        m = new float[9];  
  
        setImageMatrix(matrix);  
  
        setScaleType(ScaleType.MATRIX);  
 
        setOnTouchListener(new OnTouchListener() {  
 
            @Override  
            public boolean onTouch(View v, MotionEvent event) {  
  
                mScaleDetector.onTouchEvent(event);  
  
                PointF curr = new PointF(event.getX(), event.getY());  
  
                switch (event.getAction()) {  
  
                    case MotionEvent.ACTION_DOWN:  
  
                       last.set(curr);  
  
                        start.set(last);  
  
                        mode = DRAG;  
  
                        break;  
 
                    case MotionEvent.ACTION_MOVE:  
  
                        if (mode == DRAG) {  
  
                            float deltaX = curr.x - last.x;  
  
                            float deltaY = curr.y - last.y;  
  
                            float fixTransX = getFixDragTrans(deltaX, viewWidth, origWidth * saveScale);  
  
                            float fixTransY = getFixDragTrans(deltaY, viewHeight, origHeight * saveScale);  
  
                            matrix.postTranslate(fixTransX, fixTransY);  
  
                            fixTrans();  
  
                            last.set(curr.x, curr.y);  
  
                        }  
  
                        break;  
  
                    case MotionEvent.ACTION_UP:  
  
                        mode = NONE;  
  
                        int xDiff = (int) Math.abs(curr.x - start.x);  
  
                        int yDiff = (int) Math.abs(curr.y - start.y);  
  
                        if (xDiff < CLICK && yDiff < CLICK)  
  
                            performClick();  
  
                        break;  
  
                    case MotionEvent.ACTION_POINTER_UP:  
  
                        mode = NONE;  
  
                        break;  
  
                }  
  
                setImageMatrix(matrix);  
  
                invalidate();  
  
                return true; // indicate event was handled  
  
            }  
 
        });
    }  
  
    public void setMaxZoom(float x) {  
  
        maxScale = x;  
  
    }  
  
    private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {  
  
        @Override  
        public boolean onScaleBegin(ScaleGestureDetector detector) {  
  
            mode = ZOOM;  
  
            return true;  
  
        }  
 
        @Override  
        public boolean onScale(ScaleGestureDetector detector) {  
  
            float mScaleFactor = detector.getScaleFactor();  
  
            float origScale = saveScale;  
  
            saveScale *= mScaleFactor;  
  
            if (saveScale > maxScale) {  
  
                saveScale = maxScale;  
  
                mScaleFactor = maxScale / origScale;  
  
            } else if (saveScale < minScale) {  
  
                saveScale = minScale;  
  
                mScaleFactor = minScale / origScale;  
  
            }  
 
            if (origWidth * saveScale <= viewWidth || origHeight * saveScale <= viewHeight)  
  
                matrix.postScale(mScaleFactor, mScaleFactor, viewWidth / 2, viewHeight / 2);  
  
            else  
  
                matrix.postScale(mScaleFactor, mScaleFactor, detector.getFocusX(), detector.getFocusY());  
  
            fixTrans();  
  
            return true;  
  
        }  
  
    }  
  
    void fixTrans() {  
  
        matrix.getValues(m);  
  
        float transX = m[Matrix.MTRANS_X];  
  
        float transY = m[Matrix.MTRANS_Y];  
  
        float fixTransX = getFixTrans(transX, viewWidth, origWidth * saveScale);  
  
        float fixTransY = getFixTrans(transY, viewHeight, origHeight * saveScale);  
  
        if (fixTransX != 0 || fixTransY != 0)  
  
            matrix.postTranslate(fixTransX, fixTransY);  
  
    }  
  
   
  
    float getFixTrans(float trans, float viewSize, float contentSize) {  
  
        float minTrans, maxTrans;  
  
        if (contentSize <= viewSize) {  
  
            minTrans = 0;  
  
            maxTrans = viewSize - contentSize;  
  
        } else {  
  
            minTrans = viewSize - contentSize;  
  
            maxTrans = 0;  
  
        }  
  
        if (trans < minTrans)  
  
            return -trans + minTrans;  
  
        if (trans > maxTrans)  
  
            return -trans + maxTrans;  
  
        return 0;  
  
    }  
 
    float getFixDragTrans(float delta, float viewSize, float contentSize) {  
  
        if (contentSize <= viewSize) {  
  
            return 0;  
  
        }  
  
        return delta;  
  
    }  
  
    @Override  
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
  
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);  
  
        viewWidth = MeasureSpec.getSize(widthMeasureSpec);  
  
        viewHeight = MeasureSpec.getSize(heightMeasureSpec);  
  
        //  
        // Rescales image on rotation  
        //  
        if (oldMeasuredHeight == viewWidth && oldMeasuredHeight == viewHeight  
  
                || viewWidth == 0 || viewHeight == 0)  
  
            return;  
  
        oldMeasuredHeight = viewHeight;  
  
        oldMeasuredWidth = viewWidth;
  
        if (saveScale == 1) {  
  
            //Fit to screen.  
  
            float scale;  
  
            Drawable drawable = getDrawable();  
  
            if (drawable == null || drawable.getIntrinsicWidth() == 0 || drawable.getIntrinsicHeight() == 0)  
  
                return;  
  
            int bmWidth = drawable.getIntrinsicWidth();  
  
            int bmHeight = drawable.getIntrinsicHeight();  
  
            Log.d("bmSize", "bmWidth: " + bmWidth + " bmHeight : " + bmHeight);  
  
            float scaleX = (float) viewWidth / (float) bmWidth;  
  
            float scaleY = (float) viewHeight / (float) bmHeight;  
  
            scale = Math.min(scaleX, scaleY);  
  
            matrix.setScale(scale, scale);  
  
            // Center the image  
  
            float redundantYSpace = (float) viewHeight - (scale * (float) bmHeight);  
  
            float redundantXSpace = (float) viewWidth - (scale * (float) bmWidth);  
  
            redundantYSpace /= (float) 2;  
  
            redundantXSpace /= (float) 2;  
  
            matrix.postTranslate(redundantXSpace, redundantYSpace);  
  
            origWidth = viewWidth - 2 * redundantXSpace;  
  
            origHeight = viewHeight - 2 * redundantYSpace;  
  
            setImageMatrix(matrix);  
  
        }  
  
        fixTrans();  
  
    }  
  
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.10.2015, 17:59     Загрузка больших изоражений
Посмотрите здесь:

Как можно ускорить рендер больших текстур? - Программирование Android
Задался вопросом: Имеются две текстуры 1024х1024. Они подаются на вход фрагментному шейдеру, шейдер с ними что то делает (в моем случае...

Загрузка больших файлов - Java Сети
Подскажите пожалуйста где можно купить модуль который позволяет загружать большие видео файлы (1,5 - 2 гб) с вэб сайта на мой сервер и...

Загрузка больших файлов - PHP
Проблема. на строке:http://www.cyberforum.ru/images/editor/justifyleft.gif $src = imagecreatefromjpeg($fromPhoto); //Создает изображение...

Загрузка больших файлов - PHP
День добрый, друзья. В .htaccess я прописал эти строки: php_value post_max_size 2M php_value upload_max_filesize 1M Итак, к...

Загрузка больших файлов на сервер - PHP
сделал форму маленькие файлы грузит нормально примерно до 1МБ. вот код: &lt;form enctype=&quot;multipart/form-data&quot;...

Загрузка больших текстовых файлов - Delphi
Подскажите пожалуйста,как можно спроецировать файл в память (текстовый) и обработать его (необходимо удалить все дубликаты строк)...

Загрузка больших файлов, по кусочкам - PHP
Приветствую. Необходимо грузить большие файлы, размером по 100-200 мб. Как вариант, грузить не сразу весь файл, а по чуть-чуть,...

Загрузка больших файлов на php - PHP
Перепробовал с 10 файлообенников, но ни один не хочет работать с большими файлами. в пхп.ини менял макс. размер загруж. файла - не...

Загрузка больших видео vk api - Delphi
Доброго времени суток, стоит такая проблема : не могу загрузить большое видео в vk (~1 гиг) . С маленькими видео все проходит удачно. Инет...

Загрузка больших файлов на сервер - PHP
Всем привет! Я загружаю файлы на сервер в убунту вот таким кодом(код ниже), но загружаются файлі только меншьше 100 кбайт, а мне надо 5-6...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru